#include #include using namespace psemek::util; test_case(util_ndarray_empty) { ndarray a; expect_equal(a.size(), 0); expect(a.empty()); ndarray b; expect_equal(b.size(), 0); expect(b.empty()); ndarray c; expect_equal(c.size(), 0); expect(c.empty()); } test_case(util_ndarray_size) { ndarray a({16}); expect(!a.empty()); expect_equal(a.size(), 16); expect_equal(a.width(), 16); ndarray b({8, 16}); expect(!b.empty()); expect_equal(b.size(), 8 * 16); expect_equal(b.width(), 8); expect_equal(b.height(), 16); ndarray c({4, 8, 16}); expect(!c.empty()); expect_equal(c.size(), 4 * 8 * 16); expect_equal(c.width(), 4); expect_equal(c.height(), 8); expect_equal(c.depth(), 16); } test_case(util_ndarray_init) { ndarray a({16, 16}, 42); for (std::size_t i = 0; i < a.width(); ++i) for (std::size_t j = 0; j < a.height(); ++j) expect_equal(a(i, j), 42); } test_case(util_ndarray_release) { std::unique_ptr p(new int[256]); auto q = p.get(); ndarray a({16, 16}, std::move(p)); expect_equal(a.size(), 256); expect_equal(a.width(), 16); expect_equal(a.height(), 16); expect_equal_ptr(a.data(), q); p = a.release(); expect_equal(a.size(), 0); expect(a.empty()); expect_equal_ptr(a.data(), nullptr); expect_equal_ptr(p.get(), q); } test_case(util_ndarray_move) { ndarray a({16, 16}, 42); auto p = a.data(); ndarray b(std::move(a)); expect(a.empty()); expect_equal(a.size(), 0); expect(!b.empty()); expect_equal(b.size(), 256); expect_equal_ptr(b.data(), p); ndarray c; c = std::move(b); expect(b.empty()); expect_equal(b.size(), 0); expect(!c.empty()); expect_equal(c.size(), 256); expect_equal_ptr(c.data(), p); } test_case(util_ndarray_copy) { ndarray a({16, 16}, 42); ndarray b(a.copy()); expect(!a.empty()); expect(!b.empty()); expect_equal(a.size(), b.size()); expect_equal(a.size(), 256); expect_different_ptr(a.data(), b.data()); } test_case(util_ndarray_lifetime) { std::weak_ptr p; { ndarray, 2> a({16, 16}, std::make_shared(42)); p = a(0, 0); for (std::size_t i = 0; i < a.width(); ++i) { for (std::size_t j = 0; j < a.height(); ++j) { expect(a(i, j)); expect_equal(*a(i, j), 42); expect_equal(a(i, j).use_count(), a.size()); } } } expect(!p.lock()); expect_equal(p.use_count(), 0); }