]> Repositorios git - scryer-prolog.git/commitdiff
add more tests that pass.
authorMark Thom <[email protected]>
Fri, 11 May 2018 01:47:53 +0000 (19:47 -0600)
committerMark Thom <[email protected]>
Fri, 11 May 2018 01:47:53 +0000 (19:47 -0600)
src/prolog/ast.rs
src/prolog/indexing.rs
src/tests.rs

index f4d47303005fb96615abaa53e63b4c58eb9469f1..09ef2c8ac81794d37576f90b2af6a8c9141fe864 100644 (file)
@@ -1402,8 +1402,8 @@ impl ControlInstruction {
 #[derive(Clone)]
 pub enum IndexingInstruction {
     SwitchOnTerm(usize, usize, usize, usize),
-    SwitchOnConstant(usize, HashMap<Constant, usize>),
-    SwitchOnStructure(usize, HashMap<(ClauseName, usize), usize>)
+    SwitchOnConstant(usize, Rc<HashMap<Constant, usize>>),
+    SwitchOnStructure(usize, Rc<HashMap<(ClauseName, usize), usize>>)
 }
 
 impl From<IndexingInstruction> for Line {
index 384a343fa380f5859b7b1d6823bf6a889db99601..48751fadf5c418a056d75d8e7d8f8f9402f88be0 100644 (file)
@@ -2,6 +2,7 @@ use prolog::ast::*;
 
 use std::collections::{HashMap, VecDeque};
 use std::hash::Hash;
+use std::rc::Rc;
 
 #[derive(Clone, Copy)]
 enum IntIndex {
@@ -132,7 +133,7 @@ impl CodeOffsets {
 
         if con_ind.len() > 1 {
             let index = Self::flatten_index(con_ind, prelude.len());
-            let instr = IndexingInstruction::SwitchOnConstant(index.len(), index);
+            let instr = IndexingInstruction::SwitchOnConstant(index.len(), Rc::new(index));
 
             prelude.push_front(Line::from(instr));
 
@@ -152,7 +153,7 @@ impl CodeOffsets {
 
         if str_ind.len() > 1 {
             let index = Self::flatten_index(str_ind, prelude.len());
-            let instr = IndexingInstruction::SwitchOnStructure(index.len(), index);
+            let instr = IndexingInstruction::SwitchOnStructure(index.len(), Rc::new(index));
 
             prelude.push_front(Line::from(instr));
 
index f965a3888eeba454210ea8d309c36696ebffef16..b19cdf7982d5220342f52cabd79ed49ec429ead4 100644 (file)
@@ -1123,6 +1123,84 @@ fn test_queries_on_exceptions()
                             ["E = an_error_1", "X = _1"],
                             ["E = an_error_2", "X = _1"]]);
 }
+
+#[test]
+fn test_queries_on_skip_max_list() {
+    let mut wam = Machine::new();
+    load_init_str_and_include(&mut wam, BUILTINS, "builtins");
+
+    // test on proper and empty lists.
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 5, [], Xs).",
+                           [["Xs = []", "N = 0"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 5, [a,b,c], Xs).",
+                           [["Xs = []", "N = 3"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 2, [a,b,c], Xs).",
+                           [["Xs = [c]", "N = 2"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 3, [a,b,c], Xs).",
+                           [["Xs = []", "N = 3"]]);
+
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 0, [], Xs).",
+                           [["Xs = []", "N = 0"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 0, [a,b,c], Xs).",
+                           [["Xs = [a, b, c]", "N = 0"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 0, [a,b,c], Xs).",
+                           [["Xs = [a, b, c]", "N = 0"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 0, [a,b,c], Xs).",
+                           [["Xs = [a, b, c]", "N = 0"]]);
+
+    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(4, 0, [], Xs).");
+    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(3, 0, [a,b,c], Xs).");
+    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(2, 0, [a,b,c], Xs).");
+    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(1, 0, [a,b,c], Xs).");
+
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(0, 5, [], Xs).",
+                           [["Xs = []"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, 5, [a,b,c], Xs).",
+                           [["Xs = []"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(2, 2, [a,b,c], Xs).",
+                           [["Xs = [c]"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, 3, [a,b,c], Xs).",
+                           [["Xs = []"]]);
+
+    // tests on proper and empty lists with no max.
+    
+    // test on proper and empty lists.
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, -1, [], Xs).",
+                           [["Xs = []", "N = 0"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, -1, [a,b,c], Xs).",
+                           [["Xs = []", "N = 3"]]);
+
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, -1, [], Xs).",
+                           [["Xs = []", "N = 0"]]);
+
+    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(4, -1, [], Xs).");
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, -1, [a,b,c], Xs).",
+                           [["Xs = []"]]);
+    
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(0, -1, [], Xs).",
+                           [["Xs = []"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, -1, [a,b,c], Xs).",
+                           [["Xs = []"]]);
+    
+    // tests on partial lists.
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, 4, [a,b,c|X], Xs0).",
+                           [["X = _1", "Xs0 = _1"]]);
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, 3, [a,b,c|X], Xs0).",
+                           [["X = _1", "Xs0 = _1"]]);
+    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(3, 2, [a,b,c|X], Xs0).");
+    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(3, 1, [a,b,c|X], Xs0).");
+    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(3, 0, [a,b,c|X], Xs0).");
+        
+    // tests on cyclic lists.
+    assert_prolog_failure!(&mut wam, "?- Xs = [a,b|Xs], '$skip_max_list'(3, 5, X, Xs0).");
+    assert_prolog_failure!(&mut wam, "?- X = [a,b|Y], Y = [c,d|X], '$skip_max_list'(4, 5, X, Xs0).");
+    assert_prolog_failure!(&mut wam, "?- X = [a,b|Y], Y = [c,d|X], '$skip_max_list'(4, 3, X, Xs0).");
+
+    // tests on non lists.
+    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 9, non_list, Xs).",
+                           [["Xs = non_list", "N = 0"]]);
+}
+
 /*
 #[test]
 fn test_queries_on_conditionals()
@@ -1640,80 +1718,4 @@ fn test_queries_on_call_with_inference_limit()
                            [["R = inference_limit_exceeded", "X = _1"]]);
 
 }
-
-#[test]
-fn test_queries_on_skip_max_list() {
-    let mut wam = Machine::new();
-
-    // test on proper and empty lists.
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 5, [], Xs).",
-                           [["Xs = []", "N = 0"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 5, [a,b,c], Xs).",
-                           [["Xs = []", "N = 3"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 2, [a,b,c], Xs).",
-                           [["Xs = [c]", "N = 2"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 3, [a,b,c], Xs).",
-                           [["Xs = []", "N = 3"]]);
-
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 0, [], Xs).",
-                           [["Xs = []", "N = 0"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 0, [a,b,c], Xs).",
-                           [["Xs = [a, b, c]", "N = 0"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 0, [a,b,c], Xs).",
-                           [["Xs = [a, b, c]", "N = 0"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 0, [a,b,c], Xs).",
-                           [["Xs = [a, b, c]", "N = 0"]]);
-
-    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(4, 0, [], Xs).");
-    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(3, 0, [a,b,c], Xs).");
-    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(2, 0, [a,b,c], Xs).");
-    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(1, 0, [a,b,c], Xs).");
-
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(0, 5, [], Xs).",
-                           [["Xs = []"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, 5, [a,b,c], Xs).",
-                           [["Xs = []"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(2, 2, [a,b,c], Xs).",
-                           [["Xs = [c]"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, 3, [a,b,c], Xs).",
-                           [["Xs = []"]]);
-
-    // tests on proper and empty lists with no max.
-    
-    // test on proper and empty lists.
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, -1, [], Xs).",
-                           [["Xs = []", "N = 0"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, -1, [a,b,c], Xs).",
-                           [["Xs = []", "N = 3"]]);
-
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, -1, [], Xs).",
-                           [["Xs = []", "N = 0"]]);
-
-    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(4, -1, [], Xs).");
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, -1, [a,b,c], Xs).",
-                           [["Xs = []"]]);
-    
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(0, -1, [], Xs).",
-                           [["Xs = []"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, -1, [a,b,c], Xs).",
-                           [["Xs = []"]]);
-    
-    // tests on partial lists.
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, 4, [a,b,c|X], Xs0).",
-                           [["X = _1", "Xs0 = _1"]]);
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(3, 3, [a,b,c|X], Xs0).",
-                           [["X = _1", "Xs0 = _1"]]);
-    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(3, 2, [a,b,c|X], Xs0).");
-    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(3, 1, [a,b,c|X], Xs0).");
-    assert_prolog_failure!(&mut wam, "?- '$skip_max_list'(3, 0, [a,b,c|X], Xs0).");
-        
-    // tests on cyclic lists.
-    assert_prolog_failure!(&mut wam, "?- Xs = [a,b|Xs], '$skip_max_list'(3, 5, X, Xs0).");
-    assert_prolog_failure!(&mut wam, "?- X = [a,b|Y], Y = [c,d|X], '$skip_max_list'(4, 5, X, Xs0).");
-    assert_prolog_failure!(&mut wam, "?- X = [a,b|Y], Y = [c,d|X], '$skip_max_list'(4, 3, X, Xs0).");
-
-    // tests on non lists.
-    assert_prolog_success!(&mut wam, "?- '$skip_max_list'(N, 9, non_list, Xs).",
-                           [["Xs = non_list", "N = 0"]]);
-}
 */