From bd4c1d47aeaf1d4bca76d5713e705b0869d3f2f7 Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Sat, 26 Dec 2009 03:25:25 +0000 Subject: Added missing const qualifiers, macros and util functions to help debugging, and a simple balanced tree implementation for use in lookup tables. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@893938 13f79535-47bb-0310-9956-ffa450edef68 --- sca-cpp/trunk/kernel/kernel-test.cpp | 313 ++++++++++------------------------- 1 file changed, 84 insertions(+), 229 deletions(-) (limited to 'sca-cpp/trunk/kernel/kernel-test.cpp') diff --git a/sca-cpp/trunk/kernel/kernel-test.cpp b/sca-cpp/trunk/kernel/kernel-test.cpp index 388fbf7436..8a5e4a704d 100644 --- a/sca-cpp/trunk/kernel/kernel-test.cpp +++ b/sca-cpp/trunk/kernel/kernel-test.cpp @@ -20,24 +20,21 @@ /* $Rev$ $Date$ */ /** - * Test core utils. + * Test kernel functions. */ #include -#include -#include #include #include #include #include "function.hpp" #include "list.hpp" #include "slist.hpp" -#include "parallel.hpp" +#include "tree.hpp" #include "value.hpp" -#include "element.hpp" -#include "xml.hpp" #include "monad.hpp" #include "dynlib.hpp" +#include "perf.hpp" namespace tuscany { @@ -55,22 +52,22 @@ const int square(const int x) { return x * x; } -int mapLambda(lambda f, int v) { +int mapLambda(lambda f, int v) { return f(v); } bool testLambda() { - const lambda sq(square); + const lambda sq(square); assert(sq(2) == 4); assert(mapLambda(sq, 2) == 4); assert(mapLambda(square, 2) == 4); - const lambda incf(inc(10)); + const lambda incf(inc(10)); assert(incf(1) == 11); assert(mapLambda(incf, 1) == 11); assert(mapLambda(inc(10), 1) == 11); - lambda l; + lambda l; l = incf; assert(l(1) == 11); l = square; @@ -113,6 +110,10 @@ struct Element { return o.i == i; } }; +std::ostream& operator<<(std::ostream& out, const Element& v) { + out << v.i ; + return out; +} bool testCons() { assert(car(cons(2, mklist(3))) == 2); @@ -195,6 +196,10 @@ struct Complex { x(x), y(y) { } }; +std::ostream& operator<<(std::ostream& out, const Complex& v) { + out << "[" << v.x << ":" << v.y << "]"; + return out; +} bool testComplex() { const list p = mklist(Complex(1, 2), Complex(3, 4)); @@ -219,12 +224,12 @@ const int add(const int x, const int y) { } bool testReduce() { - const lambda r(add); + const lambda r(add); assert(reduce(r, 0, mklist(1, 2, 3)) == 6); return true; } -bool isPositive(int x) { +bool isPositive(const int x) { if(x >= 0) return true; else @@ -306,8 +311,6 @@ bool testSeq() { list s = seq(0.0, 1000.0); assert(1001 == length(s)); - //printLambdaCounters(); - //printListCounters(); assert(1001 == length(map(testSeqMap, s))); @@ -315,9 +318,6 @@ bool testSeq() { assert(201 == length(member(200.0, reverse(s)))); assert(1001 == (reduce(testSeqReduce, 0.0, s))); - //printLambdaCounters(); - //printListCounters(); - return true; } @@ -329,7 +329,7 @@ bool testValue() { assert(value(true) == value(true)); assert(value(1) == value(1)); assert(value("abcd") == value("abcd")); - lambda&)> vl(valueSquare); + lambda&)> vl(valueSquare); assert(value(vl) == value(vl)); assert(value(mklist(1, 2)) == value(mklist(1, 2))); @@ -357,6 +357,40 @@ bool testValueGC() { return true; } +bool testTree() { + const list t = mktree("a", list(), list()); + const list ct = constree("d", constree("f", constree("c", constree("e", constree("b", t))))); + const list mt = mktree(mklist("d", "f", "c", "e", "b", "a")); + assert(mt == ct); + const list l = flatten(mt); + assert(length(l) == 6); + assert(car(l) == "a"); + assert(car(reverse(l)) == "f"); + const list bt = mkbtree(l); + assert(car(bt) == "c"); + return true; +} + +const list lta(const std::string& x) { + return mklist(x.c_str(), (x + x).c_str()); +} + +bool testTreeAssoc() { + const list t = mktree(lta("a"), list(), list()); + const list at = constree(lta("d"), constree(lta("f"), constree(lta("c"), constree(lta("e"), constree(lta("b"), t))))); + const list l = flatten(at); + assert(length(l) == 6); + assert(car(l) == mklist("a", "aa")); + assert(car(reverse(l)) == mklist("f", "ff")); + const list bt = mkbtree(l); + assert(car(bt) == mklist("c", "cc")); + assert(assoctree("a", bt) == mklist("a", "aa")); + assert(assoctree("b", bt) == mklist("b", "bb")); + assert(assoctree("f", bt) == mklist("f", "ff")); + assert(isNil(assoctree("x", bt))); + return true; +} + double fib_aux(double n, double a, double b) { if(n == 0.0) return a; @@ -367,19 +401,31 @@ double fib(double n) { return fib_aux(n, 0.0, 1.0); } -bool testCppPerf() { - struct timeval start; - struct timeval end; - { - gettimeofday(&start, NULL); +struct fibMapPerf { + const bool operator()() const { + list s = seq(0.0, 999.0); + list r = map(fib, s); + assert(1000 == length(r)); + return true; + } +}; +struct nestedFibMapPerf { + const lambda fib; + nestedFibMapPerf(const lambda& fib) : fib(fib) { + } + const bool operator()() const { list s = seq(0.0, 999.0); list r = map(fib, s); assert(1000 == length(r)); + return true; + } +}; - gettimeofday(&end, NULL); - //long t = (end.tv_sec * 1000 + end.tv_usec / 1000) - (start.tv_sec * 1000 + start.tv_usec / 1000); - //std::cout << "Fib cpp function map perf test " << t << " ms" << std::endl; +bool testCppPerf() { + { + const lambda fml = fibMapPerf(); + std::cout << "Fibonacci map test " << (time(fml, 1, 1) / 1000) << " ms" << std::endl; } { @@ -396,197 +442,8 @@ bool testCppPerf() { } }; - gettimeofday(&start, NULL); - - list s = seq(0.0, 999.0); - list r = map(lambda(nested::fib), s); - assert(1000 == length(r)); - - gettimeofday(&end, NULL); - //long t = (end.tv_sec * 1000 + end.tv_usec / 1000) - (start.tv_sec * 1000 + start.tv_usec / 1000); - //std::cout << "Fib cpp nested function map perf test " << t << " ms" << std::endl; - } - return true; -} - -bool testAtomicPerf() { - struct timeval start; - struct timeval end; - { - gettimeofday(&start, NULL); - for(int i = 0; i < 10000000;) - i = i + 1; - gettimeofday(&end, NULL); - //long t = (end.tv_sec * 1000 + end.tv_usec / 1000) - (start.tv_sec * 1000 + start.tv_usec / 1000); - //std::cout << "Loop test " << t << " ms" << std::endl; - } - { - gettimeofday(&start, NULL); - for(int i = 0; i < 10000000;) - __sync_add_and_fetch(&i, 1); - gettimeofday(&end, NULL); - //long t = (end.tv_sec * 1000 + end.tv_usec / 1000) - (start.tv_sec * 1000 + start.tv_usec / 1000); - //std::cout << "Loop atomic test " << t << " ms" << std::endl; - } - { - pthread_mutex_t mutex; - pthread_mutex_init(&mutex, NULL); - gettimeofday(&start, NULL); - for(int i = 0; i < 10000000;) { - pthread_mutex_lock(&mutex); - i = i + 1; - pthread_mutex_unlock(&mutex); - } - gettimeofday(&end, NULL); - pthread_mutex_destroy(&mutex); - //long t = (end.tv_sec * 1000 + end.tv_usec / 1000) - (start.tv_sec * 1000 + start.tv_usec / 1000); - //std::cout << "Loop mutex test " << t << " ms" << std::endl; - } - return true; -} - -const int mtsquare(const int x) { - //std::cout << "thread " << threadId() << " mtsquare(" << x << ")\n"; - for(int i = 0; i < 10000000; i++) - ; - return x * x; -} - -bool testWorker() { - worker w(10); - { - const lambda func = curry(lambda (mtsquare), 2); - assert(submit(w, func) == 4); - } - { - const int max = 10; - - list > r; - for(int i = 0; i < max; i++) { - const lambda func = curry(lambda (mtsquare), i); - r = cons(submit(w, func), r); - } - for(int i = max - 1; i >= 0; i--) { - assert(car(r) == i * i); - r = cdr(r); - } - } - shutdown(w); - return true; -} - -const std::string currencyXML = -"\n" -"" -"" -"" -"" -"" -"" -"" -"" -"" -"" -"" -"" -"US" -"" -"" -"\n"; - -const std::string customerXML = -"\n" -"" -"jdoe" -"
san franciscoca
" -"12341000" -"67892000" -"45673000" -"
" -"\n"; - - -const bool isName(const value& token) { - return isTaggedList(token, attribute) && attributeName(token) == "name"; -} - -bool testReadXML() { - { - std::istringstream is(customerXML); - const list c = readXML(streamList(is)); - } - { - std::istringstream is(currencyXML); - const list c = readXML(streamList(is)); - - const value composite = car(c); - assert(isTaggedList(composite, element)); - assert(elementName(composite) == "composite"); - assert(attributeValue(car(filter(isName, elementChildren(composite)))) == std::string("currency")); - } - return true; -} - -std::ostringstream* xmlWriter(const std::string& s, std::ostringstream* os) { - (*os) << s; - return os; -} - -bool testWriteXML() { - { - std::istringstream is(customerXML); - const list c = readXML(streamList(is)); - std::ostringstream os; - writeXML(xmlWriter, &os, c); - assert(os.str() == customerXML); - } - { - std::istringstream is(currencyXML); - const list c = readXML(streamList(is)); - std::ostringstream os; - writeXML(xmlWriter, &os, c); - assert(os.str() == currencyXML); - } - return true; -} - -bool testElement() { - { - const list ad = mklist(mklist("city", std::string("san francisco")), mklist("state", std::string("ca"))); - const list ac1 = mklist(mklist("id", std::string("1234")), mklist("balance", 1000)); - const list ac2 = mklist(mklist("id", std::string("6789")), mklist("balance", 2000)); - const list ac3 = mklist(mklist("id", std::string("4567")), mklist("balance", 3000)); - { - const list c = mklist(mklist("customer", mklist("name", std::string("jdoe")), cons("address", ad), mklist("account", mklist(ac1, ac2, ac3)))); - const list e = valuesToElements(c); - const list v = elementsToValues(e); - assert(v == c); - - std::ostringstream os; - writeXML(xmlWriter, &os, e); - assert(os.str() == customerXML); - } - { - const list c = mklist(mklist("customer", mklist("name", std::string("jdoe")), cons("address", ad), cons("account", ac1), cons("account", ac2), cons("account", ac3))); - const list e = valuesToElements(c); - const list v = elementsToValues(e); - - std::ostringstream os; - writeXML(xmlWriter, &os, e); - assert(os.str() == customerXML); - } - } - { - std::istringstream is(customerXML); - const list c = readXML(streamList(is)); - const list v = elementsToValues(c); - const list e = valuesToElements(v); - std::ostringstream os; - writeXML(xmlWriter, &os, e); - assert(os.str() == customerXML); + const lambda nfml = nestedFibMapPerf(lambda(nested::fib)); + std::cout << "Nested Fibonacci map test " << (time(nfml, 1, 1) / 1000) << " ms" << std::endl; } return true; } @@ -651,8 +508,9 @@ bool testFailableMonad() { assert((m >> success()) == m); assert(m >> failableF >> failableG == m >> failableH); - failable ooops = mkfailure("ooops"); - assert(reason(ooops) == "ooops"); + std::cout << "Failable monad test... "; + failable ooops = mkfailure("test"); + assert(reason(ooops) == "test"); assert(ooops >> failableF >> failableG == ooops); return true; } @@ -683,7 +541,7 @@ const state stateH(const double v) { } bool testStateMonad() { - const lambda(double)> r(result); + const lambda(const double)> r(result); state m = result(2.0); assert((m >> stateF)(0) == stateF(2.0)(0)); @@ -697,14 +555,14 @@ bool testStateMonad() { bool testDynLib() { const failable dl(dynlib(".libs/libdynlib-test" + dynlibExt)); assert(hasContent(dl)); - const failable, std::string> sq(dynlambda("csquare", content(dl))); + const failable, std::string> sq(dynlambda("csquare", content(dl))); assert(hasContent(sq)); - lambda l(content(sq)); + lambda l(content(sq)); assert(l(2) == 4); - const failable()>, std::string> sql(dynlambda()>("csquarel", content(dl))); + const failable()>, std::string> sql(dynlambda()>("csquarel", content(dl))); assert(hasContent(sql)); - lambda()> ll(content(sql)); + lambda()> ll(content(sql)); assert(ll()(3) == 9); return true; } @@ -736,12 +594,9 @@ int main() { tuscany::testSeq(); tuscany::testValue(); tuscany::testValueGC(); - tuscany::testElement(); + tuscany::testTree(); + tuscany::testTreeAssoc(); tuscany::testCppPerf(); - tuscany::testAtomicPerf(); - tuscany::testWorker(); - tuscany::testReadXML(); - tuscany::testWriteXML(); tuscany::testIdMonad(); tuscany::testMaybeMonad(); tuscany::testFailableMonad(); -- cgit v1.2.3