summaryrefslogtreecommitdiffstats
path: root/cpp/sca/modules/eval/eval-test.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cpp/sca/modules/eval/eval-test.cpp173
1 files changed, 173 insertions, 0 deletions
diff --git a/cpp/sca/modules/eval/eval-test.cpp b/cpp/sca/modules/eval/eval-test.cpp
new file mode 100644
index 0000000000..e75485a2d5
--- /dev/null
+++ b/cpp/sca/modules/eval/eval-test.cpp
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* $Rev$ $Date$ */
+
+/**
+ * Test script evaluator.
+ */
+
+#include <assert.h>
+#include <iostream>
+#include <string>
+#include <sstream>
+#include "driver.hpp"
+
+namespace tuscany {
+
+bool testEnv() {
+ Env globalEnv = list<value>();
+ Env env = extendEnvironment(makeList(value("a")), makeList(value(1)), globalEnv);
+ defineVariable(value("x"), value(env), env);
+ //assert(lookupVariableValue(value("x"), env) == env);
+ assert(lookupVariableValue(value("a"), env) == value(1));
+ return true;
+}
+
+bool testEnvGC() {
+ resetValueCounters();
+ resetLambdaCounters();
+ resetlistCounters();
+ testEnv();
+ assert(countValues == 0);
+ assert(countLambdas == 0);
+ assert(countlists == 0);
+ return true;
+}
+
+bool testRead() {
+ std::istringstream is("abcd");
+ assert(read(is) == value("abcd"));
+
+ std::istringstream is2("123");
+ assert(read(is2) == value(123));
+
+ std::istringstream is3("(abcd)");
+ assert(read(is3) == value(makeList(value("abcd"))));
+
+ std::istringstream is4("(abcd xyz)");
+ assert(read(is4) == value(makeList(value("abcd"), value("xyz"))));
+
+ std::istringstream is5("(abcd (xyz tuv))");
+ assert(read(is5) == value(makeList(value("abcd"), value(makeList(value("xyz"), value("tuv"))))));
+
+ return true;
+}
+
+const std::string testSchemeNumber(
+ "(define (testNumber) (if (= 1 1) (display \"testNumber ok\") (error \"testNumber\"))) "
+ "(testNumber)");
+
+const std::string testSchemeString(
+ "(define (testString) (if (= \"abc\" \"abc\") (display \"testString ok\") (error \"testString\"))) "
+ "(testString)");
+
+const std::string testSchemeDefinition(
+ "(define a \"abc\") (define (testDefinition) (if (= a \"abc\") (display \"testDefinition ok\") (error \"testDefinition\"))) "
+ "(testDefinition)");
+
+const std::string testSchemeIf(
+ "(define (testIf) (if (= \"abc\" \"abc\") (if (= \"xyz\" \"xyz\") (display \"testIf ok\") (error \"testNestedIf\")) (error \"testIf\"))) "
+ "(testIf)");
+
+const std::string testSchemeCond(
+ "(define (testCond) (cond ((= \"abc\" \"abc\") (display \"testCond ok\")) (else (error \"testIf\"))))"
+ "(testCond)");
+
+const std::string testSchemeBegin(
+ "(define (testBegin) "
+ "(begin "
+ "(define a \"abc\") "
+ "(if (= a \"abc\") (display \"testBegin1 ok\") (error \"testBegin\")) "
+ "(define x \"xyz\") "
+ "(if (= x \"xyz\") (display \"testBegin2 ok\") (error \"testBegin\")) "
+ ") "
+ ") "
+ "(testBegin)");
+
+const std::string testSchemeLambda(
+ "(define sqrt (lambda (x) (* x x))) "
+ "(define (testLambda) (if (= 4 (sqrt 2)) (display \"testLambda ok\") (error \"testLambda\"))) "
+ "(testLambda)");
+
+bool contains(const std::string& str, const std::string& pattern) {
+ return str.find(pattern) != str.npos;
+}
+
+const std::string evalOutput(const std::string& scm) {
+ std::istringstream is(scm);
+ std::ostringstream os;
+ evalDriverRun(is, os);
+ return os.str();
+}
+
+bool testEval() {
+ assert(contains(evalOutput(testSchemeNumber), "testNumber ok"));
+ assert(contains(evalOutput(testSchemeString), "testString ok"));
+ assert(contains(evalOutput(testSchemeDefinition), "testDefinition ok"));
+ assert(contains(evalOutput(testSchemeIf), "testIf ok"));
+ assert(contains(evalOutput(testSchemeCond), "testCond ok"));
+ assert(contains(evalOutput(testSchemeBegin), "testBegin1 ok"));
+ assert(contains(evalOutput(testSchemeBegin), "testBegin2 ok"));
+ assert(contains(evalOutput(testSchemeLambda), "testLambda ok"));
+ return true;
+}
+
+bool testEvalExpr() {
+ const value exp = value(makeList(value("+"), value(2), value(3)));
+ Env env = setupEnvironment();
+ const value r = eval(exp, env);
+ assert(value(5) == r);
+ return true;
+}
+
+bool testEvalGC() {
+ resetValueCounters();
+ resetLambdaCounters();
+ resetlistCounters();
+ testEval();
+ assert(countValues == 0);
+ assert(countLambdas == 0);
+ assert(countlists == 0);
+ return true;
+}
+
+bool testEvalRun() {
+ evalDriverRun(std::cin, std::cout);
+ return true;
+}
+
+}
+
+int main() {
+ std::cout << "Testing..." << std::endl;
+
+ tuscany::testEnv();
+ tuscany::testEnvGC();
+ tuscany::testRead();
+ tuscany::testEval();
+ tuscany::testEvalExpr();
+ tuscany::testEvalGC();
+
+ std::cout << "OK" << std::endl;
+
+ tuscany::testEvalRun();
+
+ return 0;
+}