--- /dev/null
+#include <msp/datafile/dataerror.h>
+#include <msp/datafile/loader.h>
+#include <msp/datafile/objectloader.h>
+#include <msp/io/memory.h>
+#include <msp/test/test.h>
+
+using namespace std;
+using namespace Msp;
+
+class LoaderTests: public Test::RegisteredTest<LoaderTests>
+{
+public:
+ LoaderTests();
+
+ static const char *get_name() { return "Loader"; }
+
+private:
+ void load();
+ void int_as_float();
+ void bad_keyword();
+ void bad_signature();
+};
+
+class TestObject
+{
+public:
+ class Loader: public DataFile::ObjectLoader<TestObject>
+ {
+ public:
+ Loader(TestObject &);
+
+ private:
+ void func();
+ };
+
+ int i;
+ float f;
+ string s;
+ bool func_called;
+
+ TestObject();
+};
+
+LoaderTests::LoaderTests()
+{
+ add(&LoaderTests::load, "Load");
+ add(&LoaderTests::int_as_float, "Int -> float");
+ add(&LoaderTests::bad_keyword, "Bad keyword").expect_throw<DataFile::data_error>();
+ add(&LoaderTests::bad_signature, "Bad signature").expect_throw<DataFile::data_error>();
+}
+
+void LoaderTests::load()
+{
+ const char input[] =
+ "i 1;\n"
+ "f 2.5;\n"
+ "s \"foo\";\n"
+ "c;\n";
+
+ TestObject obj;
+ IO::Memory mem(input, sizeof(input)-1);
+ DataFile::Parser parser(mem, "-");
+ TestObject::Loader loader(obj);
+ loader.load(parser);
+
+ EXPECT_EQUAL(obj.i, 1);
+ EXPECT_EQUAL(obj.f, 2.5);
+ EXPECT_EQUAL(obj.s, "foo");
+ EXPECT_EQUAL(obj.func_called, true);
+}
+
+void LoaderTests::int_as_float()
+{
+ const char input[] =
+ "f 2;\n";
+
+ TestObject obj;
+ IO::Memory mem(input, sizeof(input)-1);
+ DataFile::Parser parser(mem, "-");
+ TestObject::Loader loader(obj);
+ loader.load(parser);
+
+ EXPECT_EQUAL(obj.f, 2);
+}
+
+void LoaderTests::bad_keyword()
+{
+ const char input[] =
+ "a;\n";
+
+ TestObject obj;
+ IO::Memory mem(input, sizeof(input)-1);
+ DataFile::Parser parser(mem, "-");
+ TestObject::Loader loader(obj);
+ loader.load(parser);
+}
+
+void LoaderTests::bad_signature()
+{
+ const char input[] =
+ "i 2.5;\n";
+
+ TestObject obj;
+ IO::Memory mem(input, sizeof(input)-1);
+ DataFile::Parser parser(mem, "-");
+ TestObject::Loader loader(obj);
+ loader.load(parser);
+}
+
+TestObject::TestObject():
+ i(0),
+ f(0),
+ func_called(false)
+{ }
+
+TestObject::Loader::Loader(TestObject &o):
+ DataFile::ObjectLoader<TestObject>(o)
+{
+ add("i", &TestObject::i);
+ add("f", &TestObject::f);
+ add("s", &TestObject::s);
+ add("c", &Loader::func);
+}
+
+void TestObject::Loader::func()
+{
+ obj.func_called = true;
+}