package alice.tuprolog;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
public class NumberCharsTest {
Prolog engine;
@Before
public void setUp() {
engine = new Prolog();
}
@Test public void integerNumber() throws PrologException {
SolveInfo solution = engine.solve("number_chars(33, L).");
assertTrue(solution.isSuccess());
Struct result = new Struct(new Term[] {new Struct("3"), new Struct("3")});
assertEquals(result, solution.getTerm("L"));
}
@Test public void integerNumberWithList() throws PrologException {
SolveInfo solution = engine.solve("number_chars(33, ['3', '3']).");
assertTrue(solution.isSuccess());
}
@Test public void realNumber() throws PrologException {
SolveInfo solution = engine.solve("number_chars(33.0, L).");
assertTrue(solution.isSuccess());
Term[] chars = new Term[] {new Struct("3"), new Struct("3"), new Struct("."), new Struct("0")};
assertEquals(new Struct(chars), solution.getTerm("L"));
}
@Test public void realListWithExponent() throws PrologException {
String goal = "number_chars(X, ['3', '.', '3', 'E', '+', '0']).";
SolveInfo solution = engine.solve(goal);
assertTrue(solution.isSuccess());
assertEquals(new alice.tuprolog.Double(3.3), solution.getTerm("X"));
}
@Test public void realNumberWithList() throws PrologException {
String goal = "number_chars(3.3, ['3', '.', '3', 'E', '+', '0']).";
SolveInfo solution = engine.solve(goal);
assertTrue(solution.isSuccess());
}
@Test public void negativeNumber() throws PrologException {
SolveInfo solution = engine.solve("number_chars(A, ['-', '2', '5']).");
assertTrue(solution.isSuccess());
assertEquals(new Int(-25), solution.getTerm("A"));
}
@Test(expected=AssertionError.class)
public void whitespaceCharacters() throws PrologException {
SolveInfo solution = engine.solve("number_chars(A, ['\\n', ' ', '3']).");
assertTrue(solution.isSuccess());
assertEquals(new Int(5), solution.getTerm("A"));
}
@Test(expected=AssertionError.class)
public void syntaxError() throws PrologException {
SolveInfo solution = engine.solve("number_chars(A, ['3', ' ']).");
assertFalse(solution.isSuccess());
// TODO Should throw syntax_error
}
@Test(expected=AssertionError.class)
public void hexadecimalNumber() throws PrologException {
SolveInfo solution = engine.solve("number_chars(A, ['0', x, f]).");
assertTrue(solution.isSuccess());
assertEquals(new Int(15), solution.getTerm("A"));
}
@Test(expected=AssertionError.class)
public void characterIntegerSequence() throws PrologException {
SolveInfo solution = engine.solve("number_chars(A, ['0', '''', a]).");
assertTrue(solution.isSuccess());
assertEquals(new Int(97), solution.getTerm("A"));
}
@Test public void realList() throws PrologException {
SolveInfo solution = engine.solve("number_chars(A, ['4', '.', '2']).");
assertTrue(solution.isSuccess());
assertEquals(new alice.tuprolog.Double(4.2), solution.getTerm("A"));
}
@Test public void realListWithNegativeExponent() throws PrologException {
String goal = "number_chars(A, ['4', '2', '.', '0', 'e', '-', '1']).";
SolveInfo solution = engine.solve(goal);
assertTrue(solution.isSuccess());
assertEquals(new alice.tuprolog.Double(4.2), solution.getTerm("A"));
}
}