From f22468b134a88fcd7acb1415c9997f578f1abe7b Mon Sep 17 00:00:00 2001
From: Aleksander Sadikov <aleksander.sadikov@fri.uni-lj.si>
Date: Tue, 15 Dec 2015 10:44:52 +0100
Subject: Add tests for Prolog.clp_fd

---
 prolog/problems/clp_fd/gcd_3/common.py           | 44 ++++++++++++++++++++++++
 prolog/problems/clp_fd/magic_1/common.py         | 41 ++++++++++++++++++++++
 prolog/problems/clp_fd/puzzle_abc_3/common.py    | 36 +++++++++++++++++++
 prolog/problems/clp_fd/puzzle_momson_2/common.py | 38 ++++++++++++++++++++
 prolog/problems/clp_fd/puzzle_ratio_2/common.py  | 36 +++++++++++++++++++
 5 files changed, 195 insertions(+)

diff --git a/prolog/problems/clp_fd/gcd_3/common.py b/prolog/problems/clp_fd/gcd_3/common.py
index 7cd6623..6e62e3b 100644
--- a/prolog/problems/clp_fd/gcd_3/common.py
+++ b/prolog/problems/clp_fd/gcd_3/common.py
@@ -1,5 +1,9 @@
 # coding=utf-8
 
+from operator import itemgetter
+import prolog.engine
+import server.problems
+
 id = 149
 number = 61
 visible = True
@@ -15,3 +19,43 @@ gcd(X, Y, GCD):-
   cd(X, Y, GCD),
   \+ ( cd(X, Y, CD), CD > GCD ).
 '''
+
+test_cases = [
+    ('gcd(1, 1, X)',
+        [{'X': '1'}]),
+    ('gcd(12, 8, X)',
+        [{'X': '4'}]),
+    ('gcd(18, 36, X)',
+        [{'X': '18'}]),
+    ('gcd(21, 14, X)',
+        [{'X': '7'}]),
+    ('gcd(10, 22, X)',
+        [{'X': '2'}]),
+    ('gcd(66, 60, X)',
+        [{'X': '6'}]),
+]
+
+def test(program, solved_problems):
+    code = (program + '\n' +
+            server.problems.solutions_for_problems('prolog', solved_problems))
+
+    n_correct = 0
+    engine_id = None
+    try:
+        engine_id, output = prolog.engine.create(code=code, timeout=1.0)
+        if engine_id is not None and 'error' not in map(itemgetter(0), output):
+            # Engine successfully created, and no syntax error in program.
+            for query, answers in test_cases:
+                if prolog.engine.check_answers(engine_id, query=query, answers=answers, timeout=1.0):
+                    n_correct += 1
+    finally:
+        if engine_id:
+            prolog.engine.destroy(engine_id)
+
+    passed = n_correct == len(test_cases)
+    hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_cases)}}]
+    return passed, hints
+
+def hint(program, solved_problems):
+    # TODO
+    return []
diff --git a/prolog/problems/clp_fd/magic_1/common.py b/prolog/problems/clp_fd/magic_1/common.py
index 17a9199..b897cb3 100644
--- a/prolog/problems/clp_fd/magic_1/common.py
+++ b/prolog/problems/clp_fd/magic_1/common.py
@@ -1,5 +1,9 @@
 # coding=utf-8
 
+from operator import itemgetter
+import prolog.engine
+import server.problems
+
 id = 151
 number = 60
 visible = True
@@ -16,3 +20,40 @@ magic(L):-
   A1+B1+C1 #= A3+B3+C3,
   A1+B2+C3 #= A3+B2+C1,
   labeling([], L).'''
+
+test_cases = [
+    ('magic(X)',
+        [{'X': '[2, 7, 6, 9, 5, 1, 4, 3, 8]'}]),
+    ('magic(X)',
+        [{'X': '[2, 9, 4, 7, 5, 3, 6, 1, 8]'}]),
+    ('setof(S, magic(S), X)',
+        [{'X': '[[2, 7, 6, 9, 5, 1, 4, 3, 8], [2, 9, 4, 7, 5, 3, 6, 1, 8], \
+                 [4, 3, 8, 9, 5, 1, 2, 7, 6], [4, 9, 2, 3, 5, 7, 8, 1, 6], \
+                 [6, 1, 8, 7, 5, 3, 2, 9, 4], [6, 7, 2, 1, 5, 9, 8, 3, 4], \
+                 [8, 1, 6, 3, 5, 7, 4, 9, 2], [8, 3, 4, 1, 5, 9, 6, 7, 2]]'}]),
+]
+
+def test(program, solved_problems):
+    code = (program + '\n' +
+            server.problems.solutions_for_problems('prolog', solved_problems))
+
+    n_correct = 0
+    engine_id = None
+    try:
+        engine_id, output = prolog.engine.create(code=code, timeout=1.0)
+        if engine_id is not None and 'error' not in map(itemgetter(0), output):
+            # Engine successfully created, and no syntax error in program.
+            for query, answers in test_cases:
+                if prolog.engine.check_answers(engine_id, query=query, answers=answers, timeout=1.0):
+                    n_correct += 1
+    finally:
+        if engine_id:
+            prolog.engine.destroy(engine_id)
+
+    passed = n_correct == len(test_cases)
+    hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_cases)}}]
+    return passed, hints
+
+def hint(program, solved_problems):
+    # TODO
+    return []
diff --git a/prolog/problems/clp_fd/puzzle_abc_3/common.py b/prolog/problems/clp_fd/puzzle_abc_3/common.py
index 1563e1f..34ad409 100644
--- a/prolog/problems/clp_fd/puzzle_abc_3/common.py
+++ b/prolog/problems/clp_fd/puzzle_abc_3/common.py
@@ -1,5 +1,9 @@
 # coding=utf-8
 
+from operator import itemgetter
+import prolog.engine
+import server.problems
+
 id = 153
 number = 57
 visible = True
@@ -13,3 +17,35 @@ puzzle_abc(A, B, C) :-
   [A,B,C] ins 0..inf,
   labeling([], [A,B,C]).
 '''
+
+test_cases = [
+    ('puzzle_abc(A, B, C)',
+        [{'A': '12', 'B': '10', 'C': '5'}]),
+    ('setof(A/B/C, puzzle_abc(A, B, C), X)',
+        [{'X': '[12/10/5]'}]),
+]
+
+def test(program, solved_problems):
+    code = (program + '\n' +
+            server.problems.solutions_for_problems('prolog', solved_problems))
+
+    n_correct = 0
+    engine_id = None
+    try:
+        engine_id, output = prolog.engine.create(code=code, timeout=1.0)
+        if engine_id is not None and 'error' not in map(itemgetter(0), output):
+            # Engine successfully created, and no syntax error in program.
+            for query, answers in test_cases:
+                if prolog.engine.check_answers(engine_id, query=query, answers=answers, timeout=1.0):
+                    n_correct += 1
+    finally:
+        if engine_id:
+            prolog.engine.destroy(engine_id)
+
+    passed = n_correct == len(test_cases)
+    hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_cases)}}]
+    return passed, hints
+
+def hint(program, solved_problems):
+    # TODO
+    return []
diff --git a/prolog/problems/clp_fd/puzzle_momson_2/common.py b/prolog/problems/clp_fd/puzzle_momson_2/common.py
index 9cef246..0f9e0a8 100644
--- a/prolog/problems/clp_fd/puzzle_momson_2/common.py
+++ b/prolog/problems/clp_fd/puzzle_momson_2/common.py
@@ -1,5 +1,9 @@
 # coding=utf-8
 
+from operator import itemgetter
+import prolog.engine
+import server.problems
+
 id = 152
 number = 58
 visible = True
@@ -13,3 +17,37 @@ puzzle_momson(M, S) :-
   M + S #= 66,
   M #> S,
   labeling([], [M, S]).'''
+
+test_cases = [
+    ('puzzle_momson(M, S)',
+        [{'M': '42', 'S': '24'}]),
+    ('puzzle_momson(M, S)',
+        [{'M': '51', 'S': '15'}]),
+    ('setof(M/S, puzzle_momson(M, S), X)',
+        [{'X': '[42/24, 51/15]'}]),
+]
+
+def test(program, solved_problems):
+    code = (program + '\n' +
+            server.problems.solutions_for_problems('prolog', solved_problems))
+
+    n_correct = 0
+    engine_id = None
+    try:
+        engine_id, output = prolog.engine.create(code=code, timeout=1.0)
+        if engine_id is not None and 'error' not in map(itemgetter(0), output):
+            # Engine successfully created, and no syntax error in program.
+            for query, answers in test_cases:
+                if prolog.engine.check_answers(engine_id, query=query, answers=answers, timeout=1.0):
+                    n_correct += 1
+    finally:
+        if engine_id:
+            prolog.engine.destroy(engine_id)
+
+    passed = n_correct == len(test_cases)
+    hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_cases)}}]
+    return passed, hints
+
+def hint(program, solved_problems):
+    # TODO
+    return []
diff --git a/prolog/problems/clp_fd/puzzle_ratio_2/common.py b/prolog/problems/clp_fd/puzzle_ratio_2/common.py
index 73b9234..eca7f62 100644
--- a/prolog/problems/clp_fd/puzzle_ratio_2/common.py
+++ b/prolog/problems/clp_fd/puzzle_ratio_2/common.py
@@ -1,5 +1,9 @@
 # coding=utf-8
 
+from operator import itemgetter
+import prolog.engine
+import server.problems
+
 id = 154
 number = 59
 visible = True
@@ -16,3 +20,35 @@ puzzle_ratio(A, B) :-
   A #< 200,
   B #< 200,
   labeling([], [A, B]).'''
+
+test_cases = [
+    ('puzzle_ratio(A, B)',
+        [{'A': '30', 'B': '24'}]),
+    ('setof(A/B, puzzle_ratio(A, B), X)',
+        [{'X': '[30/24]'}]),
+]
+
+def test(program, solved_problems):
+    code = (program + '\n' +
+            server.problems.solutions_for_problems('prolog', solved_problems))
+
+    n_correct = 0
+    engine_id = None
+    try:
+        engine_id, output = prolog.engine.create(code=code, timeout=1.0)
+        if engine_id is not None and 'error' not in map(itemgetter(0), output):
+            # Engine successfully created, and no syntax error in program.
+            for query, answers in test_cases:
+                if prolog.engine.check_answers(engine_id, query=query, answers=answers, timeout=1.0):
+                    n_correct += 1
+    finally:
+        if engine_id:
+            prolog.engine.destroy(engine_id)
+
+    passed = n_correct == len(test_cases)
+    hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_cases)}}]
+    return passed, hints
+
+def hint(program, solved_problems):
+    # TODO
+    return []
-- 
cgit v1.2.1