From 0f980e204dd2bac135527ef78650df6d750cd02d Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Thu, 10 May 2018 19:47:53 -0600 Subject: [PATCH] add more tests that pass. --- src/prolog/ast.rs | 4 +- src/prolog/indexing.rs | 5 +- src/tests.rs | 154 +++++++++++++++++++++-------------------- 3 files changed, 83 insertions(+), 80 deletions(-) diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index f4d47303..09ef2c8a 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -1402,8 +1402,8 @@ impl ControlInstruction { #[derive(Clone)] pub enum IndexingInstruction { SwitchOnTerm(usize, usize, usize, usize), - SwitchOnConstant(usize, HashMap), - SwitchOnStructure(usize, HashMap<(ClauseName, usize), usize>) + SwitchOnConstant(usize, Rc>), + SwitchOnStructure(usize, Rc>) } impl From for Line { diff --git a/src/prolog/indexing.rs b/src/prolog/indexing.rs index 384a343f..48751fad 100644 --- a/src/prolog/indexing.rs +++ b/src/prolog/indexing.rs @@ -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)); diff --git a/src/tests.rs b/src/tests.rs index f965a388..b19cdf79 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -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"]]); -} */ -- 2.54.0