add more tests that pass.
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
154
src/tests.rs
154
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"]]);
|
||||
}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user