diff --git a/Tests/GLLTests.fs b/Tests/GLLTests.fs index 6c6ff2f..1477ac5 100644 --- a/Tests/GLLTests.fs +++ b/Tests/GLLTests.fs @@ -44,7 +44,8 @@ let simpleLoopRSMForDyckLanguage = RSM.TerminalEdge(2,1,0) |]) RSM([|box|],box) - + + let tests = testList "GLL CFPQ Tests with SPPF" [ @@ -85,6 +86,200 @@ let tests = (nodes,edges) runGLLAndCheckResult graph startV q expected + testCase "Easy example"<| fun () -> + let graph = InputGraph([|TerminalEdge(0, 0, 1) + TerminalEdge(1, 0, 2) + |]) + let startV = [|0|] + let q = + let box = + RSMBox ( + 0, + HashSet([0; 3]), + [| + RSM.TerminalEdge(0,0,1) + RSM.NonTerminalEdge(1,0,2) + RSM.TerminalEdge(2,0,3) + |] + ) + RSM([|box|],box) + + let expected = + let nodes = Dictionary<_,_>() + nodes.Add(0, TriplesStoredSPPFNode.RangeNode (0, 0,0,0)) + nodes.Add(1, TriplesStoredSPPFNode.EpsilonNode (0,0)) + nodes.Add(2, TriplesStoredSPPFNode.RangeNode (0, 2,0,3)) + nodes.Add(3, TriplesStoredSPPFNode.IntermediateNode (1,2)) + nodes.Add(4, TriplesStoredSPPFNode.RangeNode (0, 1,0,2)) + nodes.Add(5, TriplesStoredSPPFNode.IntermediateNode (1,1)) + nodes.Add(6, TriplesStoredSPPFNode.RangeNode (0, 1,0,1)) + nodes.Add(7, TriplesStoredSPPFNode.TerminalNode (0,0, 1)) + nodes.Add(8, TriplesStoredSPPFNode.RangeNode (1, 1,1,2)) + nodes.Add(9, TriplesStoredSPPFNode.NonTerminalNode (1,0, 1)) + nodes.Add(10, TriplesStoredSPPFNode.RangeNode (1, 1,0,0)) + nodes.Add(11, TriplesStoredSPPFNode.EpsilonNode (1,0)) + nodes.Add(12, TriplesStoredSPPFNode.RangeNode (1, 2,2,3)) + nodes.Add(13, TriplesStoredSPPFNode.TerminalNode (1,0, 2)) + let edges = ResizeArray<_>([|(0,1); (2,3); (3,4); (4,5); (5,6); (6,7); (5,8); (8,9); (9,10); (10,11); (3,12); (12,13)|]) + (nodes,edges) + runGLLAndCheckResult graph startV q expected + + testCase "Cubic tiny example"<| fun () -> + let graph = InputGraph([|TerminalEdge(0, 0, 1) + TerminalEdge(1, 0, 2) + |]) + let startV = [|0|] + let q = + let box = + RSMBox ( + 0, + HashSet([0; 4]), + [| + RSM.TerminalEdge(0,0,1) + RSM.NonTerminalEdge(1,0,2) + RSM.TerminalEdge(2,0,3) + RSM.NonTerminalEdge(3,0,4) + |] + ) + RSM([|box|],box) + let expected = + let nodes = Dictionary<_,_>() + nodes.Add(0, TriplesStoredSPPFNode.RangeNode (0, 0, 0, 0)) + nodes.Add(1, TriplesStoredSPPFNode.EpsilonNode (0, 0)) + nodes.Add(2, TriplesStoredSPPFNode.RangeNode (0, 2, 0, 4)) + nodes.Add(3, TriplesStoredSPPFNode.IntermediateNode (2, 3)) + nodes.Add(4, TriplesStoredSPPFNode.RangeNode (0, 2, 0, 3)) + nodes.Add(5, TriplesStoredSPPFNode.IntermediateNode (1, 2)) + nodes.Add(6, TriplesStoredSPPFNode.RangeNode (0, 1, 0, 2)) + nodes.Add(7, TriplesStoredSPPFNode.IntermediateNode (1, 1)) + nodes.Add(8, TriplesStoredSPPFNode.RangeNode (0, 1, 0, 1)) + nodes.Add(9, TriplesStoredSPPFNode.TerminalNode (0, 0, 1)) + nodes.Add(10, TriplesStoredSPPFNode.RangeNode (1, 1, 1, 2)) + nodes.Add(11, TriplesStoredSPPFNode.NonTerminalNode (1, 0, 1)) + nodes.Add(12, TriplesStoredSPPFNode.RangeNode (1, 1, 0, 0)) + nodes.Add(13, TriplesStoredSPPFNode.EpsilonNode (1, 0)) + nodes.Add(14, TriplesStoredSPPFNode.RangeNode (1, 2, 2, 3)) + nodes.Add(15, TriplesStoredSPPFNode.TerminalNode (1, 0, 2)) + nodes.Add(16, TriplesStoredSPPFNode.RangeNode (2, 2, 3, 4)) + nodes.Add(17, TriplesStoredSPPFNode.NonTerminalNode (2, 0, 2)) + nodes.Add(18, TriplesStoredSPPFNode.RangeNode (2, 2, 0, 0)) + nodes.Add(19, TriplesStoredSPPFNode.EpsilonNode (2, 0)) + let edges = ResizeArray<_>([|(0,1); + (2,3); (3,4); (4,5); (5,6); (6,7); (7,8); (8,9); + (7,10); (10,11); (11,12); (12,13); + (5, 14); (14, 15); + (3, 16); (16, 17); (17, 18); (18, 19)|]) + (nodes,edges) + runGLLAndCheckResult graph startV q expected + + + testCase "Cubic small example"<| fun () -> + let graph = InputGraph([|TerminalEdge(0, 0, 1) + TerminalEdge(1, 0, 2) + TerminalEdge(2, 0, 3) + TerminalEdge(3, 0, 4) + |]) + let startV = [|0|] + let q = + let box = + RSMBox ( + 0, + HashSet([0; 4]), + [| + RSM.TerminalEdge(0,0,1) + RSM.NonTerminalEdge(1,0,2) + RSM.TerminalEdge(2,0,3) + RSM.NonTerminalEdge(3,0,4) + |] + ) + RSM([|box|],box) + let expected = + let nodes = Dictionary<_,_>() + nodes.Add(0, TriplesStoredSPPFNode.RangeNode (0, 0, 0, 0)) + nodes.Add(1, TriplesStoredSPPFNode.EpsilonNode (0, 0)) + nodes.Add(2, TriplesStoredSPPFNode.RangeNode (0, 4, 0, 4)) + nodes.Add(3, TriplesStoredSPPFNode.IntermediateNode (4, 3)) + nodes.Add(4, TriplesStoredSPPFNode.RangeNode (0, 4, 0, 3)) + nodes.Add(5, TriplesStoredSPPFNode.IntermediateNode (3, 2)) + nodes.Add(6, TriplesStoredSPPFNode.RangeNode (0, 3, 0, 2)) + nodes.Add(7, TriplesStoredSPPFNode.IntermediateNode (1, 1)) + nodes.Add(8, TriplesStoredSPPFNode.RangeNode (0, 1, 0, 1)) + nodes.Add(9, TriplesStoredSPPFNode.TerminalNode (0, 0, 1)) + nodes.Add(10, TriplesStoredSPPFNode.RangeNode (1, 3, 1, 2)) + nodes.Add(11, TriplesStoredSPPFNode.NonTerminalNode (1, 0, 3)) + nodes.Add(12, TriplesStoredSPPFNode.RangeNode (1, 3, 0, 4)) + nodes.Add(13, TriplesStoredSPPFNode.IntermediateNode (3, 3)) + nodes.Add(14, TriplesStoredSPPFNode.RangeNode (1, 3, 0, 3)) + nodes.Add(15, TriplesStoredSPPFNode.IntermediateNode (2, 2)) + nodes.Add(16, TriplesStoredSPPFNode.RangeNode (1, 2, 0, 2)) + nodes.Add(17, TriplesStoredSPPFNode.IntermediateNode (2, 1)) + nodes.Add(18, TriplesStoredSPPFNode.RangeNode (1, 2, 0, 1)) + nodes.Add(19, TriplesStoredSPPFNode.TerminalNode (1, 0, 2)) + nodes.Add(20, TriplesStoredSPPFNode.RangeNode (2, 2, 1, 2)) + nodes.Add(21, TriplesStoredSPPFNode.NonTerminalNode (2, 0, 2)) + nodes.Add(22, TriplesStoredSPPFNode.RangeNode (2, 2, 0, 0)) + nodes.Add(23, TriplesStoredSPPFNode.EpsilonNode (2, 0)) + nodes.Add(24, TriplesStoredSPPFNode.RangeNode (2, 3, 2, 3)) + nodes.Add(25, TriplesStoredSPPFNode.TerminalNode (2, 0, 3)) + nodes.Add(26, TriplesStoredSPPFNode.RangeNode (3, 3, 3, 4)) + nodes.Add(27, TriplesStoredSPPFNode.NonTerminalNode (3, 0, 3)) + nodes.Add(28, TriplesStoredSPPFNode.RangeNode (3, 3, 0, 0)) + nodes.Add(29, TriplesStoredSPPFNode.EpsilonNode (3, 0)) + nodes.Add(30, TriplesStoredSPPFNode.RangeNode (3, 4, 2, 3)) + nodes.Add(31, TriplesStoredSPPFNode.TerminalNode (3, 0, 4)) + nodes.Add(32, TriplesStoredSPPFNode.RangeNode (4, 4, 3, 4)) + nodes.Add(33, TriplesStoredSPPFNode.NonTerminalNode (4, 0, 4)) + nodes.Add(34, TriplesStoredSPPFNode.RangeNode (4, 4, 0, 0)) + nodes.Add(35, TriplesStoredSPPFNode.EpsilonNode (4, 0)) + nodes.Add(36, TriplesStoredSPPFNode.IntermediateNode (2, 3)) + nodes.Add(37, TriplesStoredSPPFNode.RangeNode (0, 2, 0, 3)) + nodes.Add(38, TriplesStoredSPPFNode.IntermediateNode (1, 2)) + nodes.Add(39, TriplesStoredSPPFNode.RangeNode (0, 1, 0, 2)) + nodes.Add(40, TriplesStoredSPPFNode.IntermediateNode (1, 1)) + nodes.Add(41, TriplesStoredSPPFNode.RangeNode (1, 1, 1, 2)) + nodes.Add(42, TriplesStoredSPPFNode.NonTerminalNode (1, 0, 1)) + nodes.Add(43, TriplesStoredSPPFNode.RangeNode (1, 1, 0, 0)) + nodes.Add(44, TriplesStoredSPPFNode.EpsilonNode (1, 0)) + nodes.Add(45, TriplesStoredSPPFNode.RangeNode (1, 2, 2, 3)) + nodes.Add(46, TriplesStoredSPPFNode.TerminalNode (1, 0, 2)) + nodes.Add(47, TriplesStoredSPPFNode.RangeNode (2, 4, 3, 4)) + nodes.Add(48, TriplesStoredSPPFNode.NonTerminalNode (2, 0, 4)) + nodes.Add(49, TriplesStoredSPPFNode.RangeNode (2, 4, 0, 4)) + nodes.Add(50, TriplesStoredSPPFNode.IntermediateNode (4, 3)) + nodes.Add(51, TriplesStoredSPPFNode.RangeNode (2, 4, 0, 3)) + nodes.Add(52, TriplesStoredSPPFNode.IntermediateNode (3, 2)) + nodes.Add(53, TriplesStoredSPPFNode.RangeNode (2, 3, 0, 2)) + nodes.Add(54, TriplesStoredSPPFNode.IntermediateNode (3, 1)) + nodes.Add(55, TriplesStoredSPPFNode.RangeNode (2, 3, 0, 1)) + nodes.Add(56, TriplesStoredSPPFNode.TerminalNode (2, 0, 3)) + nodes.Add(57, TriplesStoredSPPFNode.RangeNode (3, 3, 1, 2)) + nodes.Add(58, TriplesStoredSPPFNode.NonTerminalNode (3, 0, 3)) + nodes.Add(59, TriplesStoredSPPFNode.RangeNode (0, 2, 0, 4)) + nodes.Add(60, TriplesStoredSPPFNode.IntermediateNode (2, 3)) + nodes.Add(61, TriplesStoredSPPFNode.RangeNode (2, 2, 3, 4)) + nodes.Add(62, TriplesStoredSPPFNode.NonTerminalNode (2, 0, 2)) + let edges = ResizeArray<_>([|(0,1); + (2,3); (3,4); (4,5); (5,6); (6,7); (7,8); (8,9); + (7,10); (10,11); (11,12); (12,13); (13,14); (14,15); (15,16); (16,17); (17,18); (18,19); + (17,20); (20,21); (21,22); (22,23); + (15,24); (24,25); + (13,26); (26,27); (27,28); (28,29); + (5,30); (30,31); + (3,32); (32,33); (33,34); (34,35); + (2,36); (36,37); (37,38); (38,39); (39,40); (40,8); + (40,41); (41,42); (42,43); (43,44); + (38,45); (45,46); + (36,47); (47,48); (48,49); (49,50); (50,51); (51,52); (52,53); (53,54); (54,55); (55,56); + (54,57); (57,58); (58,28); + (52,30); + (50,32); + (59,60); (60,37); + (60,61); (61,62); (62,22)|]) + (nodes,edges) + runGLLAndCheckResult graph startV q expected + + + testCase "Minimal worst case, simple loop RSM for Dyck language" <| fun () -> let graph = InputGraph([|TerminalEdge(0, 0, 0) TerminalEdge(0, 1, 1) diff --git a/Tests/Program.fs b/Tests/Program.fs index b7c132c..3ad9f01 100644 --- a/Tests/Program.fs +++ b/Tests/Program.fs @@ -33,7 +33,18 @@ let go() = [] let main argv = - Tests.runTestsWithCLIArgs [] [||] (testList "all tests" [Tests.GLLTests.tests]) + let allTests = testList "all tests" [Tests.GLLTests.tests] + + if argv |> Array.contains "--list-tests" then + printfn "Available tests:" + allTests + |> Test.toTestCodeList + |> List.iter (fun test -> + let fullPath = String.concat "/" test.name + printfn "%s" fullPath) + 0 + else + Tests.runTestsWithCLIArgs [] [||] allTests //go () \ No newline at end of file