@@ -9,16 +9,229 @@ open FSharpPlus.Internals
9
9
#endif
10
10
11
11
module Collections =
12
-
12
+ open System
13
+ open System.Collections
14
+ open System.Collections.Generic
15
+ open System.Collections.Concurrent
16
+ open System.Collections.ObjectModel
17
+
13
18
[<Test>]
14
19
let chunkBy () =
15
20
#if TEST_TRACE
16
21
Traces.reset()
17
22
#endif
23
+
18
24
let source = [1; 2; 3; 5; 7; 9]
19
25
let expected = [(1, [1]); (0, [2]); (1, [3; 5; 7; 9])]
20
26
let actual = chunkBy (flip (%) 2) source
21
27
CollectionAssert.AreEqual(expected, actual)
28
+
22
29
#if TEST_TRACE
23
30
CollectionAssert.AreEqual (["ChunkBy, list<'T>"], Traces.get())
24
- #endif
31
+ #endif
32
+
33
+
34
+ let testCollections =
35
+ let bigSeq = seq {1..10000000}
36
+ let bigLst = [ 1..10000000 ]
37
+ let bigArr = [|1..10000000|]
38
+ let bigMut = ResizeArray(seq {1..10000000})
39
+
40
+ let _ = head bigSeq
41
+ let _ = head bigLst
42
+ let _ = head bigArr
43
+
44
+ let _ = skip 1000 bigSeq
45
+ let _ = skip 1000 bigLst
46
+ let _ = skip 1000 bigArr
47
+ let _ = skip 1000 bigMut
48
+ let _ = "hello world" |> skip 6 |> toList
49
+ let _ = ofList ['h';'e';'l';'l';'o';' '] + "world"
50
+ let _ = item 2 "hello"
51
+
52
+ ()
53
+
54
+
55
+ let testSeqConversions =
56
+ let sk: Generic.Stack<_> = ofSeq { 1 .. 3 }
57
+ let sg: string = ofSeq {'1'..'3'} // but it will come back as seq<char>
58
+ let sb: Text.StringBuilder = ofSeq {'1'..'3'} // but it will come back as seq<char>
59
+ let sq1:_ seq = ofSeq { 1 .. 3 }
60
+ let sq2:_ seq = ofSeq (seq [(1, "One"); (2, "Two")])
61
+ let sq3:_ seq = ofSeq (seq [(1, "One", '1'); (2, "Two", '2')])
62
+ let sq4:_ seq = ofSeq (seq [(1, "One", '1', 1M); (2, "Two", '2', 2M)])
63
+ let ls1:_ list = ofSeq {'1'..'3'}
64
+ let ls2:_ list = ofSeq (seq [(1, "One", '1'); (2, "Two", '2')])
65
+ let st1:_ Set = ofSeq {'1'..'3'}
66
+ let st2:_ Set = ofSeq (seq [(1, "One", '1'); (2, "Two", '2')])
67
+ let ss: Generic.SortedSet<_> = ofSeq (seq [3..6])
68
+ let ra: Generic.List<_> = ofSeq (seq [1..3])
69
+ let sl: Generic.SortedList<_,_> = ofSeq (seq [(1, "One"); (2, "Two")]) // but it will come back as ...
70
+ let _sl:Generic.SortedList<_,_> = ofSeq (seq [KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
71
+ let dc :Generic.Dictionary<_,_> = ofSeq (seq [(1, "One"); (2, "Two")]) // but it will come back as KeyValuePair
72
+ let mp :Map<_,_> = ofSeq (seq [(1, "One"); (2, "Two")]) // but it will come back as ...
73
+ let _mp:Map<_,_> = ofSeq (seq [KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
74
+ let d : Generic.IDictionary<_,_> = ofSeq (seq [("One", 1)]) // but it will come back as ...
75
+ let _d: Generic.IDictionary<_,_> = ofSeq (seq [KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
76
+ let r : IReadOnlyDictionary<_,_> = ofSeq (seq [("One", 1)]) // but it will come back as ...
77
+ let _r: IReadOnlyDictionary<_,_> = ofSeq (seq [KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
78
+ let rc: IReadOnlyCollection<_> = ofSeq (seq [2..7])
79
+ let ut: Hashtable = ofSeq (seq [1,'1';2, '2';3,'3']) // but it will come back as seq<obj>
80
+ let al: ArrayList = ofSeq (seq ["1";"2";"3"]) // but it will come back as seq<obj>
81
+ let us: SortedList = ofSeq (seq [4,'2';3,'4']) // but it will come back as seq<obj>
82
+ let cc: BlockingCollection<_> = ofSeq {'1'..'3'} // but it will come back as seq<obj>
83
+ let cd: ConcurrentDictionary<_,_> = ofSeq (seq [(1, "One"); (2, "Two")]) // but it will come back as ...
84
+ let _cd:ConcurrentDictionary<_,_> = ofSeq (seq [KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
85
+ let cb: ConcurrentBag<_> = ofSeq {'1'..'3'}
86
+
87
+ // now go back
88
+ let _sk' = toSeq sk
89
+ let _sg' = toSeq sg
90
+ let _sb' = toSeq sb
91
+ let _sq1' = toSeq sq1
92
+ let _sq2' = toSeq sq2
93
+ let _sq3' = toSeq sq3
94
+ let _sq4' = toSeq sq4
95
+ let _ls1' = toSeq ls1
96
+ let _ls2' = toSeq ls2
97
+ let _st1' = toSeq st1
98
+ let _st2' = toSeq st2
99
+ let _ss' = toSeq ss
100
+ let _ra' = toSeq ra
101
+ let _sl' = toSeq sl
102
+ let _dc' = toSeq dc
103
+ let _mp' = toSeq mp
104
+ let _d' = toSeq d
105
+ let _r' = toSeq r
106
+ let _rc' = toSeq rc
107
+ let _ut' = toSeq ut
108
+ let _al' = toSeq al
109
+ let _us' = toSeq us
110
+ let _cc' = toSeq cc
111
+ let _cd' = toSeq cd
112
+ let _cb' = toSeq cb
113
+
114
+ // there are some 'one-way' collections that can only be converted toSeq
115
+ let columns =
116
+ let d = new Data.DataTable ()
117
+ [|new Data.DataColumn "id";new Data.DataColumn "column1";new Data.DataColumn "column2"|] |> d.Columns.AddRange
118
+ d.Columns
119
+ let _col1 = columns |> find (fun x -> x.ColumnName = "column1")
120
+ let _cols = columns |> toList |> map (fun x -> x.ColumnName)
121
+
122
+ // Defaults
123
+ let _12: WrappedListI<_> = seq [1;2] |> ofSeq
124
+
125
+ ()
126
+
127
+ let testListConversions =
128
+
129
+ // From sequence
130
+ let sk: Generic.Stack<_> = ofList [ 1 .. 3 ]
131
+ let sg: string = ofList ['1'..'3'] // but it will come back as seq<char>
132
+ let sb: Text.StringBuilder = ofList ['1'..'3'] // but it will come back as seq<char>
133
+ let sq1:_ seq = ofList [ 1 .. 3 ]
134
+ let sq2:_ seq = ofList ([(1, "One"); (2, "Two")])
135
+ let sq3:_ seq = ofList ([(1, "One", '1'); (2, "Two", '2')])
136
+ let sq4:_ seq = ofList ([(1, "One", '1', 1M); (2, "Two", '2', 2M)])
137
+ let ls1:_ list = ofList ['1'..'3']
138
+ let ls2:_ list = ofList ([(1, "One", '1'); (2, "Two", '2')])
139
+ let st1:_ Set = ofList ['1'..'3']
140
+ let st2:_ Set = ofList ([(1, "One", '1'); (2, "Two", '2')])
141
+ let ss: Generic.SortedSet<_> = ofList ([3..6])
142
+ let ra: Generic.List<_> = ofList ([1..3])
143
+ let sl: Generic.SortedList<_,_> = ofList ([(1, "One"); (2, "Two")]) // but it will come back as ...
144
+ let _sl:Generic.SortedList<_,_> = ofList ([KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
145
+ let dc :Generic.Dictionary<_,_> = ofList ([(1, "One"); (2, "Two")]) // but it will come back as KeyValuePair
146
+ let mp :Map<_,_> = ofList ([(1, "One"); (2, "Two")]) // but it will come back as ...
147
+ let _mp:Map<_,_> = ofList ([KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
148
+ let d : Generic.IDictionary<_,_> = ofList ([("One", 1)]) // but it will come back as ...
149
+ let _d: Generic.IDictionary<_,_> = ofList ([KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
150
+ let r : IReadOnlyDictionary<_,_> = ofList ([("One", 1)]) // but it will come back as ...
151
+ let _r: IReadOnlyDictionary<_,_> = ofList ([KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
152
+ let rc: IReadOnlyCollection<_> = ofList ([2..5])
153
+ let ut: Hashtable = ofList ([1,'1';2, '2';3,'3']) // but it will come back as seq<obj>
154
+ let al: ArrayList = ofList (["1";"2";"3"]) // but it will come back as seq<obj>
155
+ let us: SortedList = ofList ([4,'2';3,'4']) // but it will come back as seq<obj>
156
+ let cc: BlockingCollection<_> = ofList ['1'..'3'] // but it will come back as seq<obj>
157
+ let cd: ConcurrentDictionary<_,_> = ofList ([(1, "One"); (2, "Two")]) // but it will come back as ...
158
+ let _cd:ConcurrentDictionary<_,_> = ofList ([KeyValuePair(1, "One"); KeyValuePair(2, "Two")])
159
+ let cb: ConcurrentBag<_> = ofList ['1'..'3']
160
+
161
+ // now go back
162
+ let _sk' = toList sk
163
+ let _sg' = toList sg
164
+ let _sb' = toList sb
165
+ let _sq1' = toList sq1
166
+ let _sq2' = toList sq2
167
+ let _sq3' = toList sq3
168
+ let _sq4' = toList sq4
169
+ let _ls1' = toList ls1
170
+ let _ls2' = toList ls2
171
+ let _st1' = toList st1
172
+ let _st2' = toList st2
173
+ let _ss' = toList ss
174
+ let _ra' = toList ra
175
+ let _sl' = toList sl
176
+ let _dc' = toList dc
177
+ let _mp' = toList mp
178
+ let _d' = toList d
179
+ let _r' = toList r
180
+ let _rc' = toList rc
181
+ let _ut' = toList ut
182
+ let _al' = toList al
183
+ let _us' = toList us
184
+ let _cc' = toList cc
185
+ let _cd' = toList cd
186
+ let _cb' = toList cb
187
+
188
+ ()
189
+
190
+ let testSorts =
191
+ let _r1 = [4..1] |> sort
192
+ let _r2 = [4..1] |> sortBy string
193
+ let _r3 = seq [4..1] |> sort
194
+ let _r4 = seq [4..1] |> sortBy string
195
+ let _r5 = ResizeArray [4..1] |> sort
196
+ let _r6 = ResizeArray [4..1] |> sortBy string
197
+ ()
198
+
199
+ let testGeneralizableValues () =
200
+ let a: list<_> = empty
201
+ let _ = 0 ::a
202
+ let _ = '0'::a
203
+
204
+ let b: WrappedSeqA<_> = empty
205
+ let _ = WrappedSeqA [ 0 ] <|> b
206
+ let _ = WrappedSeqA ['0'] <|> b
207
+
208
+ ()
209
+
210
+ [<Test>]
211
+ let readOnlyNth () =
212
+ let readOnlyCollection = ReadOnlyCollection [|1..10|]
213
+ let iReadOnlyList = readOnlyCollection :> IReadOnlyList<_>
214
+ Assert.AreEqual (2, nth 1 [1..10])
215
+ Assert.AreEqual (2, nth 1 readOnlyCollection)
216
+ Assert.AreEqual (2, nth 1 iReadOnlyList)
217
+
218
+ [<Test>]
219
+ let readOnlyNthIndex () =
220
+ let l = ListOnlyIndex [1..10]
221
+ Assert.AreEqual (2, nth 1 l)
222
+ let rl = ReadOnlyListOnlyIndex [1..10]
223
+ Assert.AreEqual (2, nth 1 rl)
224
+
225
+ [<Test>]
226
+ let choose () =
227
+ let d = choose Some ((ofSeq :seq<_*_> -> Dictionary<_,_>) (seq ["a", 1; "b", 2]))
228
+ Assert.IsInstanceOf<Option<Dictionary<string,int>>> (Some d)
229
+
230
+ let d' = choose Some ((ofSeq :seq<_*_> -> IDictionary<_,_>) (seq ["a", 1; "b", 2]))
231
+ Assert.IsInstanceOf<Option<IDictionary<string,int>>> (Some d')
232
+
233
+ let rd = choose Some ((ofSeq :seq<_*_> -> IReadOnlyDictionary<_,_>) (seq ["a", 1; "b", 2]))
234
+ Assert.IsInstanceOf<Option<IReadOnlyDictionary<string,int>>> (Some rd)
235
+
236
+ let m = choose Some ((ofSeq :seq<_*_> -> Map<_,_>) (seq ["a", 1; "b", 2]))
237
+ Assert.IsInstanceOf<Option<Map<string,int>>> (Some m)
0 commit comments