#include <iostream> #include <j/cppunit/cppunit.hpp> #include <j/cppunit/assert.hpp> #include <j/lang/assertion_error.hpp> #include <j/lang/dl.hpp> using namespace j; using namespace j::lang; using namespace j::cppunit; #if (IS_WINDOWS) constexpr const char *DL_FILE = "./test-lib/libcalc.dll"; #else constexpr const char *DL_FILE = "./test-lib/libcalc.so"; #endif class DlTest : public TestCase { public: DlTest() {} ~DlTest() {} void setUp() {} void tearDown() {} void testDl() { Dl dl(DL_FILE); typedef int (*CalcFunc)(int, int); CalcFunc add = reinterpret_cast<CalcFunc>(dl.sym("calc_add")); int ret = add(1, 2); assertEquals(3, ret); } void testCopy() { Dl dl(DL_FILE); Dl dl2 = dl; typedef int (*CalcFunc)(int, int); CalcFunc sub = reinterpret_cast<CalcFunc>(dl2.sym("calc_sub")); int ret = sub(3, 2); assertEquals(1, ret); } void testMove() { Dl dl(DL_FILE); Dl dl2 = std::move(dl); typedef int (*CalcFunc)(int, int); CalcFunc sub = reinterpret_cast<CalcFunc>(dl2.sym("calc_sub")); int ret = sub(3, 2); assertEquals(1, ret); } void testOpEq() { Dl dl(DL_FILE); Dl *dl2 = new Dl(DL_FILE); *dl2 = dl; typedef int (*CalcFunc)(int, int); CalcFunc mul = reinterpret_cast<CalcFunc>(dl2->sym("calc_mul")); int ret = mul(3, 2); assertEquals(6, ret); dl = dl; typedef int (*CalcFunc)(int, int); CalcFunc div = reinterpret_cast<CalcFunc>(dl.sym("calc_div")); ret = div(6, 2); assertEquals(3, ret); delete dl2; } void testOpEqMove() { Dl dl(DL_FILE); Dl *dl2 = new Dl(DL_FILE); *dl2 = std::move(dl); typedef int (*CalcFunc)(int, int); CalcFunc mul = reinterpret_cast<CalcFunc>(dl2->sym("calc_mul")); int ret = mul(3, 2); assertEquals(6, ret); *dl2 = std::move(*dl2); typedef int (*CalcFunc)(int, int); CalcFunc div = reinterpret_cast<CalcFunc>(dl2->sym("calc_div")); ret = div(6, 2); assertEquals(3, ret); delete dl2; } void testToString() { Dl dl(DL_FILE); String str = dl.toString(); // 文字列中に, Dl が含まれるハズ。 (N1j4lang2DlE) int idx = str.indexOf("Dl"); assertTrue(idx >= 0); } void suite() { RUN_TEST("new Dl()", testDl); RUN_TEST("copy", testCopy); RUN_TEST("move", testMove); RUN_TEST("operator=(Dl &)", testOpEq); RUN_TEST("operator=(Dl &&)", testOpEqMove); RUN_TEST("toString()", testToString); } };