PH Logo
Logo intepreter modeled after UCB Logo.
/Users/paul/Documents/phlogo/core/thingtest.cpp
00001 #define BOOST_TEST_MAIN
00002 #include <boost/test/unit_test.hpp>
00003 
00004 #include <iostream>
00005 #include <string>
00006 #include <sstream>
00007 #include <algorithm>
00008 #include <iterator>
00009 
00010 #include "Interpreter.h"
00011 #include "Console.h"
00012 #include "World.h"
00013 #include "Thing.h"
00014 #include "List.h"
00015 #include "Array.h"
00016 #include "StringTokenStream.h"
00017 
00018 using namespace std;
00019 using namespace phlogo;
00020 
00021 void test_word_thing(const string &s, const string &val) {
00022         StringConsole c;
00023         World w(&c);
00024         Interpreter itp(&w);
00025         w.setThing("X", "foo");
00026         w.setThing("Y", "bar");
00027         StringTokenStream ts(s);
00028         pThing thing;
00029         itp.getNextThing(&w, &ts, &thing);
00030         BOOST_CHECK(thing->isWord());
00031         BOOST_CHECK_EQUAL(thing->getWord(), val);
00032 }
00033 
00034 List test_list_thing(const string &s, pThing *thing) {
00035         StringConsole c;
00036         World w(&c);
00037         Interpreter itp(&w);
00038         w.setThing("X", "foo");
00039         w.setThing("Y", "bar");
00040         StringTokenStream ts(s);
00041         itp.getNextThing(&w, &ts, thing);
00042         BOOST_CHECK((*thing)->isList());
00043         return (*thing)->getList();
00044 }
00045 
00046 Array test_array_thing(const string &s, pThing *thing) {
00047         StringConsole c;
00048         World w(&c);
00049         Interpreter itp(&w);
00050         w.setThing("X", "foo");
00051         w.setThing("Y", "bar");
00052         StringTokenStream ts(s);
00053         itp.getNextThing(&w, &ts, thing);
00054         BOOST_CHECK((*thing)->isArray());
00055         return (*thing)->getArray();
00056 }
00057 
00058 BOOST_AUTO_TEST_CASE( literalword )
00059 {
00060         test_word_thing("X", "X");
00061 }
00062 
00063 BOOST_AUTO_TEST_CASE( literalword2 )
00064 {
00065         StringConsole c;
00066         World w(&c);
00067         Interpreter itp(&w);
00068         string words = "X Y";
00069         StringTokenStream ts(words);
00070         pThing thing;
00071         itp.getNextThing(&w, &ts, &thing);
00072         BOOST_CHECK(thing->isWord());
00073         BOOST_CHECK_EQUAL(thing->getWord(), "X");
00074         BOOST_CHECK(!ts.atEnd());
00075         itp.getNextThing(&w, &ts, &thing);
00076         BOOST_CHECK(thing->isWord());
00077         BOOST_CHECK_EQUAL(thing->getWord(), "Y");
00078         BOOST_CHECK(ts.atEnd());
00079 }
00080 
00081 BOOST_AUTO_TEST_CASE( varword )
00082 {
00083         test_word_thing(":X", "foo");
00084 }
00085 
00086 BOOST_AUTO_TEST_CASE( varword2 )
00087 {
00088         StringConsole c;
00089         World w(&c);
00090         Interpreter itp(&w);
00091         w.setThing("X", "foo");
00092         w.setThing("Y", "bar");
00093         string words = ":X :Y";
00094         StringTokenStream ts(words);
00095         pThing thing;
00096         itp.getNextThing(&w, &ts, &thing);
00097         BOOST_CHECK(thing->isWord());
00098         BOOST_CHECK_EQUAL(thing->getWord(), "foo");
00099         BOOST_CHECK(!ts.atEnd());
00100         itp.getNextThing(&w, &ts, &thing);
00101         BOOST_CHECK(thing->isWord());
00102         BOOST_CHECK_EQUAL(thing->getWord(), "bar");
00103         BOOST_CHECK(ts.atEnd());
00104 }
00105 
00106 BOOST_AUTO_TEST_CASE( lists )
00107 {
00108         pThing thing;
00109         List list = test_list_thing("[1]", &thing);
00110         BOOST_CHECK_EQUAL((int)list.size(), 1);
00111         BOOST_CHECK(list.get(0)->isWord());
00112         BOOST_CHECK_EQUAL(list.get(0)->getWord(), "1");
00113         
00114         list = test_list_thing("[1,2]", &thing);
00115         BOOST_CHECK_EQUAL((int)list.size(), 2);
00116         BOOST_CHECK(list.get(0)->isWord());
00117         BOOST_CHECK_EQUAL(list.get(0)->getWord(), "1");
00118         BOOST_CHECK(list.get(1)->isWord());
00119         BOOST_CHECK_EQUAL(list.get(1)->getWord(), "2");
00120         
00121         list = test_list_thing("[1,2,3]", &thing);
00122         BOOST_CHECK_EQUAL((int)list.size(), 3);
00123         BOOST_CHECK(list.get(0)->isWord());
00124         BOOST_CHECK_EQUAL(list.get(0)->getWord(), "1");
00125         BOOST_CHECK(list.get(2)->isWord());
00126         BOOST_CHECK_EQUAL(list.get(2)->getWord(), "3");
00127 }
00128 
00129 BOOST_AUTO_TEST_CASE( lists2 )
00130 {
00131         StringConsole c;
00132         World w(&c);
00133         Interpreter itp(&w);
00134         w.setThing("X", "foo");
00135         w.setThing("Y", "bar");
00136         string words = "[1] [2,3]";
00137         StringTokenStream ts(words);
00138         pThing thing;
00139         itp.getNextThing(&w, &ts, &thing);
00140         BOOST_CHECK(thing->isList());
00141         BOOST_CHECK(!ts.atEnd());
00142         BOOST_CHECK_EQUAL((int)thing->getList().size(), 1);
00143         BOOST_CHECK(thing->getList().get(0)->isWord());
00144         BOOST_CHECK_EQUAL(thing->getList().get(0)->getWord(), "1");
00145         itp.getNextThing(&w, &ts, &thing);
00146         BOOST_CHECK(thing->isList());
00147         BOOST_CHECK(ts.atEnd());
00148         BOOST_CHECK_EQUAL((int)thing->getList().size(), 2);
00149         BOOST_CHECK(thing->getList().get(0)->isWord());
00150         BOOST_CHECK_EQUAL(thing->getList().get(0)->getWord(), "2");
00151         BOOST_CHECK(thing->getList().get(1)->isWord());
00152         BOOST_CHECK_EQUAL(thing->getList().get(1)->getWord(), "3");
00153 }
00154 
00155 BOOST_AUTO_TEST_CASE( listsoflists )
00156 {
00157         pThing thing;
00158         List list = test_list_thing("[[1]]", &thing);
00159         BOOST_CHECK_EQUAL((int)list.size(), 1);
00160         BOOST_CHECK(list.get(0)->isList());
00161         BOOST_CHECK_EQUAL((int)list.get(0)->getList().size(), 1);
00162         BOOST_CHECK_EQUAL(list.get(0)->getList().get(0)->getWord(), "1");
00163         
00164         list = test_list_thing("[[1],[2,3]]", &thing);
00165         BOOST_CHECK_EQUAL((int)list.size(), 2);
00166         BOOST_CHECK(list.get(0)->isList());
00167         BOOST_CHECK_EQUAL((int)list.get(0)->getList().size(), 1);
00168         BOOST_CHECK_EQUAL(list.get(0)->getList().get(0)->getWord(), "1");
00169         BOOST_CHECK(list.get(1)->isList());
00170         BOOST_CHECK_EQUAL((int)list.get(1)->getList().size(), 2);
00171         BOOST_CHECK_EQUAL(list.get(1)->getList().get(0)->getWord(), "2");
00172         BOOST_CHECK_EQUAL(list.get(1)->getList().get(1)->getWord(), "3");
00173 }
00174 
00175 BOOST_AUTO_TEST_CASE( arrays )
00176 {
00177         pThing thing;
00178         Array array = test_array_thing("{1}", &thing);
00179         BOOST_CHECK_EQUAL((int)array.size(), 1);
00180         BOOST_CHECK(array.get(0)->isWord());
00181         BOOST_CHECK_EQUAL(array.get(0)->getWord(), "1");
00182 
00183         array = test_array_thing("{1,2}", &thing);
00184         BOOST_CHECK_EQUAL((int)array.size(), 2);
00185         BOOST_CHECK(array.get(0)->isWord());
00186         BOOST_CHECK_EQUAL(array.get(0)->getWord(), "1");
00187         BOOST_CHECK(array.get(1)->isWord());
00188         BOOST_CHECK_EQUAL(array.get(1)->getWord(), "2");
00189         
00190         array = test_array_thing("{1,2,3}", &thing);
00191         BOOST_CHECK_EQUAL((int)array.size(), 3);
00192         BOOST_CHECK(array.get(0)->isWord());
00193         BOOST_CHECK_EQUAL(array.get(0)->getWord(), "1");
00194         BOOST_CHECK(array.get(2)->isWord());
00195         BOOST_CHECK_EQUAL(array.get(2)->getWord(), "3");
00196 }
00197 
00198 BOOST_AUTO_TEST_CASE( arrayofarrays )
00199 {
00200         pThing thing;
00201         Array array = test_array_thing("{{1}}", &thing);
00202         BOOST_CHECK_EQUAL((int)array.size(), 1);
00203         BOOST_CHECK(array.get(0)->isArray());
00204         BOOST_CHECK_EQUAL((int)array.get(0)->getArray().size(), 1);
00205         BOOST_CHECK_EQUAL(array.get(0)->getArray().get(0)->getWord(), "1");
00206         
00207         array = test_array_thing("{{1},{2,3}}", &thing);
00208         BOOST_CHECK_EQUAL((int)array.size(), 2);
00209         BOOST_CHECK(array.get(0)->isArray());
00210         BOOST_CHECK_EQUAL((int)array.get(0)->getArray().size(), 1);
00211         BOOST_CHECK_EQUAL(array.get(0)->getArray().get(0)->getWord(), "1");
00212         BOOST_CHECK(array.get(1)->isArray());
00213         BOOST_CHECK_EQUAL((int)array.get(1)->getArray().size(), 2);
00214         BOOST_CHECK_EQUAL(array.get(1)->getArray().get(0)->getWord(), "2");
00215         BOOST_CHECK_EQUAL(array.get(1)->getArray().get(1)->getWord(), "3");
00216 }
00217 
00218 BOOST_AUTO_TEST_CASE( verbthing )
00219 {
00220         test_word_thing("$1.1 $3.1 word", "w");
00221 }
00222 
00223 BOOST_AUTO_TEST_CASE( subseqthing )
00224 {
00225         test_word_thing("$1.1 ( $3.1 word )", "w");
00226 }
 All Classes Functions