|
PH Logo
Logo intepreter modeled after UCB Logo.
|
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 }
1.7.4