Newer
Older
libj / modules / j / base / test / src / ut_dl.cpp
#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);
    }
};