Skip to content

Commit

Permalink
Adding integration tests for the "basic.pl" program.
Browse files Browse the repository at this point in the history
  • Loading branch information
eazar001 committed Sep 12, 2019
1 parent 3e197c0 commit fb5fda8
Show file tree
Hide file tree
Showing 2 changed files with 243 additions and 8 deletions.
5 changes: 3 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ struct ChoicePoint {

impl Display for Environment {
fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> {
let env: Vec<_> = self.0.iter().filter(|(Var(_, n), _t)| *n == 0).collect();
let mut env: Vec<_> = self.0.iter().filter(|(Var(_, n), _t)| *n == 0).collect();
env.sort();
let mut response = String::from("\n");
let last = env.last().cloned();

Expand Down Expand Up @@ -309,7 +310,7 @@ pub fn solve_toplevel(interactive: bool, kb: &[Assertion], c: Clause) -> Vec<Str
Err(SolveErr::NoSolution) => {
println!("\nNo.");
if !interactive {
answers.push(String::from("No."))
answers.push(String::from("No"))
}
break;
}
Expand Down
246 changes: 240 additions & 6 deletions tests/query_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,199 @@ fn parse_query(query: &str) -> Clause {
}

fn compare_answers(answers: Vec<String>, expected: &[&str]) {
let mut answers: Vec<&str> = answers.iter().map(|s| s.trim()).collect();
answers.sort();
let answers: Vec<&str> = answers.iter().map(|s| s.trim()).collect();
assert_eq!(answers, expected);
}

#[test]
fn test_basic_1_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("unify(X, X).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = X1"])
}

#[test]
fn test_basic_2_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("unify(X, Y).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = X1\nY = X1"])
}

#[test]
fn test_basic_3_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("unify(a, a).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["Yes"])
}

#[test]
fn test_basic_3_fails() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("unify(a, b).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["No"])
}

#[test]
fn test_basic_4_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("unify(X, a).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = a"])
}

#[test]
fn test_basic_5_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("member(a, list(a, nil)).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["Yes"])
}

#[test]
fn test_basic_6_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("member(a, list(a, list(b, nil))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["Yes"])
}

#[test]
fn test_basic_7_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("member(a, list(a, list(b, list(a, nil)))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["Yes", "Yes"])
}

#[test]
fn test_basic_7_fails() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("member(c, list(a, list(b, list(a, nil)))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["No"])
}

#[test]
fn test_basic_8_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("member(X, list(a, list(b, list(a, nil)))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = a", "X = b", "X = a"]);
}

#[test]
fn test_basic_9_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("unify(X, b), member(X, list(a, list(b, list(a, nil)))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = b"]);
}

#[test]
fn test_basic_10_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("unify(X, b), member(X, list(a, list(b, list(b, nil)))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = b", "X = b"]);
}

#[test]
fn test_basic_11_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("append(X, Y, list(a, list(b, nil))).");

let results = solve_toplevel(false, &source, query);

compare_answers(
results,
&[
"X = nil\nY = list(a, list(b, nil))",
"X = list(a, nil)\nY = list(b, nil)",
"X = list(a, list(b, nil))\nY = nil",
],
);
}

#[test]
fn test_basic_12_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("append(X, list(Y, list(Z, nil)), list(a, list(b, nil))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = nil\nY = a\nZ = b"]);
}

#[test]
fn test_basic_12_fails() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("append(X, list(Y, list(q, nil)), list(a, list(b, nil))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["No"]);
}

#[test]
fn test_basic_13_fails() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query(
"append(list(a, list(b, list(c, nil))), list(Y, list(Z, nil)), list(a, list(b, nil))).",
);

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["No"]);
}

#[test]
fn test_basic_14_fails() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("append(list(a, nil), list(b, nil), list(a, list(b, nil))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["Yes"]);
}

#[test]
fn test_basic_14_succeeds() {
let source = read_source_code("tests/example_programs/basic/basic.pl");
let query = parse_query("append(list(a, nil), X, list(a, list(b, nil))).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = list(b, nil)"]);
}

#[test]
fn test_the_expanse_program_1_succeeds() {
let source = read_source_code("tests/example_programs/the_expanse/the_expanse.pl");
Expand All @@ -42,7 +230,7 @@ fn test_the_expanse_program_1_succeeds() {

compare_answers(
results,
&["X = 'James Holden'", "X = 'McDowell'", "X = 'Naomi Nagata'"],
&["X = 'James Holden'", "X = 'Naomi Nagata'", "X = 'McDowell'"],
)
}

Expand All @@ -53,7 +241,7 @@ fn test_the_expanse_program_1_fails() {

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["No."])
compare_answers(results, &["No"])
}

#[test]
Expand All @@ -66,8 +254,8 @@ fn test_the_expanse_program_2_succeeds() {
compare_answers(
results,
&[
"S = 'Canterbury'\nX = 'McDowell'",
"S = 'Rocinante'\nX = 'James Holden'",
"S = 'Canterbury'\nX = 'McDowell'",
],
)
}
Expand All @@ -79,5 +267,51 @@ fn test_the_expanse_program_2_fails() {

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["No."])
compare_answers(results, &["No"])
}

#[test]
fn test_the_expanse_program_3_succeeds() {
let source = read_source_code("tests/example_programs/the_expanse/the_expanse.pl");
let query = parse_query("mechanic('Rocinante', X).");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["X = 'Amos Burton'"])
}

#[test]
fn test_the_expanse_program_3_fails() {
let source = read_source_code("tests/example_programs/the_expanse/the_expanse.pl");
let query = parse_query("mechanic('Rocinante', 'Alex Kamal').");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["No"])
}

#[test]
fn test_the_expanse_program_4_succeeds() {
let source = read_source_code("tests/example_programs/the_expanse/the_expanse.pl");
let query = parse_query("mechanic(S, 'Amos Burton').");

let results = solve_toplevel(false, &source, query);

compare_answers(results, &["S = 'Canterbury'", "S = 'Rocinante'"])
}

#[test]
fn test_the_expanse_program_5_succeeds() {
let source = read_source_code("tests/example_programs/the_expanse/the_expanse.pl");
let query = parse_query("mechanic(S, 'Amos Burton'), pilot(S, Pilot).");

let results = solve_toplevel(false, &source, query);

compare_answers(
results,
&[
"Pilot = 'Alex Kamal'\nS = 'Canterbury'",
"Pilot = 'Alex Kamal'\nS = 'Rocinante'",
],
)
}

0 comments on commit fb5fda8

Please sign in to comment.