Skip to content

Commit bc1a80b

Browse files
committed
test: add test cases for empty table pattern matching
- Test [] pattern matches tables with #x == 0 - Test {} pattern matches tables with next(x) == nil - Test distinguishing between [] and {} patterns - Test empty patterns with then syntax - Test empty patterns with multiple when branches Related to #249
1 parent df26217 commit bc1a80b

File tree

2 files changed

+327
-1
lines changed

2 files changed

+327
-1
lines changed

spec/inputs/test/switch_spec.yue

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,86 @@ describe "switch", ->
265265
when 1 then "yes"
266266
else "no"
267267
assert.same getValue!, "yes"
268+
269+
it "should match empty list pattern with []", ->
270+
-- [] uses #x == 0 check, matches tables with no array elements
271+
emptyArray = {}
272+
hashTable = {a: 1, b: 2}
273+
arrayWithElements = {1, 2, 3}
274+
275+
result1 = switch emptyArray
276+
when [] then "empty list"
277+
else "not empty list"
278+
assert.same result1, "empty list"
279+
280+
result2 = switch hashTable
281+
when [] then "empty list"
282+
else "not empty list"
283+
assert.same result2, "empty list"
284+
285+
result3 = switch arrayWithElements
286+
when [] then "empty list"
287+
else "not empty list"
288+
assert.same result3, "not empty list"
289+
290+
it "should match empty table pattern with {}", ->
291+
-- {} uses next(x) == nil check, matches only truly empty tables
292+
emptyTable = {}
293+
hashTable = {a: 1}
294+
arrayTable = {1}
295+
296+
result1 = switch emptyTable
297+
when {} then "empty table"
298+
else "not empty table"
299+
assert.same result1, "empty table"
300+
301+
result2 = switch hashTable
302+
when {} then "empty table"
303+
else "not empty table"
304+
assert.same result2, "not empty table"
305+
306+
result3 = switch arrayTable
307+
when {} then "empty table"
308+
else "not empty table"
309+
assert.same result3, "not empty table"
310+
311+
it "should distinguish between [] and {} patterns", ->
312+
-- [] matches tables with #x == 0 (no array part)
313+
-- {} matches tables with next(x) == nil (completely empty)
314+
classify = (x) ->
315+
switch x
316+
when {} then "truly empty"
317+
when [] then "no array elements"
318+
else "has elements"
319+
320+
assert.same classify({}), "truly empty"
321+
assert.same classify({a: 1}), "no array elements"
322+
assert.same classify({1, 2}), "has elements"
323+
324+
it "should handle empty list pattern with then syntax", ->
325+
result = switch {}
326+
when [] then "matched"
327+
else "not matched"
328+
assert.same result, "matched"
329+
330+
it "should handle empty table pattern with then syntax", ->
331+
result = switch {}
332+
when {} then "matched"
333+
else "not matched"
334+
assert.same result, "matched"
335+
336+
it "should match empty patterns with multiple when branches", ->
337+
emptyArray = {}
338+
emptyHash = {}
339+
340+
result1 = switch emptyArray
341+
when {1} then "has 1"
342+
when [] then "empty list"
343+
else "other"
344+
assert.same result1, "empty list"
345+
346+
result2 = switch emptyHash
347+
when {a: 1} then "has a"
348+
when {} then "empty table"
349+
else "other"
350+
assert.same result2, "empty table"

spec/outputs/test/switch_spec.lua

Lines changed: 244 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ return describe("switch", function()
727727
end
728728
return assert.same(result, "matched cool")
729729
end)
730-
return it("should handle switch in function call", function()
730+
it("should handle switch in function call", function()
731731
local something = 1
732732
local getValue
733733
getValue = function()
@@ -739,4 +739,247 @@ return describe("switch", function()
739739
end
740740
return assert.same(getValue(), "yes")
741741
end)
742+
it("should match empty list pattern with []", function()
743+
local emptyArray = { }
744+
local hashTable = {
745+
a = 1,
746+
b = 2
747+
}
748+
local arrayWithElements = {
749+
1,
750+
2,
751+
3
752+
}
753+
local result1
754+
do
755+
local _type_0 = type(emptyArray)
756+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
757+
local _match_0 = false
758+
if _tab_0 then
759+
if #emptyArray == 0 then
760+
_match_0 = true
761+
result1 = "empty list"
762+
end
763+
end
764+
if not _match_0 then
765+
result1 = "not empty list"
766+
end
767+
end
768+
assert.same(result1, "empty list")
769+
local result2
770+
do
771+
local _type_0 = type(hashTable)
772+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
773+
local _match_0 = false
774+
if _tab_0 then
775+
if #hashTable == 0 then
776+
_match_0 = true
777+
result2 = "empty list"
778+
end
779+
end
780+
if not _match_0 then
781+
result2 = "not empty list"
782+
end
783+
end
784+
assert.same(result2, "empty list")
785+
local result3
786+
do
787+
local _type_0 = type(arrayWithElements)
788+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
789+
local _match_0 = false
790+
if _tab_0 then
791+
if #arrayWithElements == 0 then
792+
_match_0 = true
793+
result3 = "empty list"
794+
end
795+
end
796+
if not _match_0 then
797+
result3 = "not empty list"
798+
end
799+
end
800+
return assert.same(result3, "not empty list")
801+
end)
802+
it("should match empty table pattern with {}", function()
803+
local emptyTable = { }
804+
local hashTable = {
805+
a = 1
806+
}
807+
local arrayTable = {
808+
1
809+
}
810+
local result1
811+
do
812+
local _type_0 = type(emptyTable)
813+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
814+
local _match_0 = false
815+
if _tab_0 then
816+
if next(emptyTable) == nil then
817+
_match_0 = true
818+
result1 = "empty table"
819+
end
820+
end
821+
if not _match_0 then
822+
result1 = "not empty table"
823+
end
824+
end
825+
assert.same(result1, "empty table")
826+
local result2
827+
do
828+
local _type_0 = type(hashTable)
829+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
830+
local _match_0 = false
831+
if _tab_0 then
832+
if next(hashTable) == nil then
833+
_match_0 = true
834+
result2 = "empty table"
835+
end
836+
end
837+
if not _match_0 then
838+
result2 = "not empty table"
839+
end
840+
end
841+
assert.same(result2, "not empty table")
842+
local result3
843+
do
844+
local _type_0 = type(arrayTable)
845+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
846+
local _match_0 = false
847+
if _tab_0 then
848+
if next(arrayTable) == nil then
849+
_match_0 = true
850+
result3 = "empty table"
851+
end
852+
end
853+
if not _match_0 then
854+
result3 = "not empty table"
855+
end
856+
end
857+
return assert.same(result3, "not empty table")
858+
end)
859+
it("should distinguish between [] and {} patterns", function()
860+
local classify
861+
classify = function(x)
862+
local _type_0 = type(x)
863+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
864+
local _match_0 = false
865+
if _tab_0 then
866+
if next(x) == nil then
867+
_match_0 = true
868+
return "truly empty"
869+
end
870+
end
871+
if not _match_0 then
872+
local _match_1 = false
873+
if _tab_0 then
874+
if #x == 0 then
875+
_match_1 = true
876+
return "no array elements"
877+
end
878+
end
879+
if not _match_1 then
880+
return "has elements"
881+
end
882+
end
883+
end
884+
assert.same(classify({ }), "truly empty")
885+
assert.same(classify({
886+
a = 1
887+
}), "no array elements")
888+
return assert.same(classify({
889+
1,
890+
2
891+
}), "has elements")
892+
end)
893+
it("should handle empty list pattern with then syntax", function()
894+
local result
895+
do
896+
local _exp_0 = { }
897+
local _type_0 = type(_exp_0)
898+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
899+
local _match_0 = false
900+
if _tab_0 then
901+
if #_exp_0 == 0 then
902+
_match_0 = true
903+
result = "matched"
904+
end
905+
end
906+
if not _match_0 then
907+
result = "not matched"
908+
end
909+
end
910+
return assert.same(result, "matched")
911+
end)
912+
it("should handle empty table pattern with then syntax", function()
913+
local result
914+
do
915+
local _exp_0 = { }
916+
local _type_0 = type(_exp_0)
917+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
918+
local _match_0 = false
919+
if _tab_0 then
920+
if next(_exp_0) == nil then
921+
_match_0 = true
922+
result = "matched"
923+
end
924+
end
925+
if not _match_0 then
926+
result = "not matched"
927+
end
928+
end
929+
return assert.same(result, "matched")
930+
end)
931+
return it("should match empty patterns with multiple when branches", function()
932+
local emptyArray = { }
933+
local emptyHash = { }
934+
local result1
935+
do
936+
local _type_0 = type(emptyArray)
937+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
938+
local _match_0 = false
939+
if _tab_0 then
940+
if 1 == emptyArray[1] then
941+
_match_0 = true
942+
result1 = "has 1"
943+
end
944+
end
945+
if not _match_0 then
946+
local _match_1 = false
947+
if _tab_0 then
948+
if #emptyArray == 0 then
949+
_match_1 = true
950+
result1 = "empty list"
951+
end
952+
end
953+
if not _match_1 then
954+
result1 = "other"
955+
end
956+
end
957+
end
958+
assert.same(result1, "empty list")
959+
local result2
960+
do
961+
local _type_0 = type(emptyHash)
962+
local _tab_0 = "table" == _type_0 or "userdata" == _type_0
963+
local _match_0 = false
964+
if _tab_0 then
965+
if 1 == emptyHash.a then
966+
_match_0 = true
967+
result2 = "has a"
968+
end
969+
end
970+
if not _match_0 then
971+
local _match_1 = false
972+
if _tab_0 then
973+
if next(emptyHash) == nil then
974+
_match_1 = true
975+
result2 = "empty table"
976+
end
977+
end
978+
if not _match_1 then
979+
result2 = "other"
980+
end
981+
end
982+
end
983+
return assert.same(result2, "empty table")
984+
end)
742985
end)

0 commit comments

Comments
 (0)