@@ -62,4 +62,39 @@ test.suite("TableExt", function(suite)
6262 assert .tableeq (b , { 4 , 5 , 6 })
6363 assert .tableeq (c , { 6 , 5 , 4 })
6464 end )
65+
66+ suite :case ("toset" , function (assert )
67+ local a = { 1 , 2 , 4 , 2 , 1 }
68+ local setA = tableext .toset (a )
69+ assert .eq (setA [1 ], true )
70+ assert .eq (setA [2 ], true )
71+ assert .eq (setA [3 ], nil )
72+ assert .eq (setA [4 ], true )
73+ assert .eq (setA [5 ], nil )
74+
75+ local setSize = # tableext .keys (setA )
76+ assert .eq (setSize , 3 )
77+ assert .neq (setSize , # a )
78+
79+ -- Sanity check: sets created using an array of numbers don't break from having "gaps" between the number keys.
80+
81+ local foundKeys : { number } = {}
82+ for key , value in setA do
83+ assert .eq (value , true )
84+ table.insert (foundKeys , key )
85+ end
86+ assert .eq (# foundKeys , setSize )
87+ assert .eq (setA [foundKeys [1 ]], true )
88+ assert .eq (setA [foundKeys [2 ]], true )
89+ assert .eq (setA [foundKeys [3 ]], true )
90+
91+ local b = { "a" , "b" , "c" , "a" }
92+ local setB = tableext .toset (b )
93+ assert .eq (setB ["a" ], true )
94+ assert .eq (setB ["b" ], true )
95+ assert .eq (setB ["c" ], true )
96+ assert .eq (setB ["d" ], nil )
97+ assert .eq (# tableext .keys (setB ), 3 )
98+ assert .neq (# tableext .keys (setB ), # b )
99+ end )
65100end )
0 commit comments