From 28008a746a31abb7909dd86cb0cd413ac8943b0b Mon Sep 17 00:00:00 2001 From: jmpoep Date: Thu, 7 Dec 2023 16:51:07 +0800 Subject: first commit --- unit-tests/test1.cc | 309 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 unit-tests/test1.cc (limited to 'unit-tests/test1.cc') diff --git a/unit-tests/test1.cc b/unit-tests/test1.cc new file mode 100644 index 0000000..4aedef7 --- /dev/null +++ b/unit-tests/test1.cc @@ -0,0 +1,309 @@ +#include "../runtime/common.h" +#include "../runtime/crypto.h" +#include "../core/objects.h" +#include "../core/osutils.h" +#include "../core/streams.h" +#include "../core/files.h" +#include "../core/processors.h" +#include "../core/intel.h" + +#include "testfile.h" + +static uint8_t test_data[] = "test data"; +const size_t TEST_DATA_SIZE = 9ul; + +TEST(AbstractStreamTest, FileStream_Test) +{ + bool status; + for (size_t bufSize = TEST_DATA_SIZE + 3; bufSize > 3; bufSize -= 3) + { + FileStream s(bufSize); + uint8_t buf[16]; + size_t rc; + uint64_t rc1, rc2; + + status = s.Open("test.bin", fmOpenReadWrite | fmShareDenyNone | fmCreate); + ASSERT_TRUE(status); + // Check .Write() + rc = s.Write(reinterpret_cast(test_data), TEST_DATA_SIZE); + ASSERT_EQ(rc, TEST_DATA_SIZE); + // Check .Seek() with various origins + rc2 = s.Seek(1, soBeginning); + ASSERT_EQ(rc2, 1ull); + rc2 = s.Seek(2, soCurrent); + ASSERT_EQ(rc2, 3ull); + rc2 = s.Seek(1 - (int64_t)TEST_DATA_SIZE, soEnd); + ASSERT_EQ(rc2, 1ull); + // Check .Tell() + rc1 = s.Tell(); + ASSERT_EQ(rc1, rc2); + // Check .Read(), validate data + rc = s.Read(buf, TEST_DATA_SIZE - 1); + ASSERT_EQ(rc, TEST_DATA_SIZE - 1); + ASSERT_EQ(0, memcmp(buf, &test_data[1], TEST_DATA_SIZE - 1)); //-V512 + s.Seek(0, soBeginning); + rc = s.Read(buf, TEST_DATA_SIZE / 2); + ASSERT_EQ(rc, TEST_DATA_SIZE / 2); + ASSERT_EQ(0, memcmp(buf, &test_data[0], TEST_DATA_SIZE / 2)); //-V512 + rc = s.Read(buf, TEST_DATA_SIZE / 2); + ASSERT_EQ(rc, TEST_DATA_SIZE / 2); + ASSERT_EQ(0, memcmp(buf, &test_data[TEST_DATA_SIZE / 2], TEST_DATA_SIZE / 2)); //-V512 + // Check .GetSize() + rc2 = s.Size(); + ASSERT_EQ(TEST_DATA_SIZE, rc2); + // Check .Resize + rc2 = s.Resize(2 * TEST_DATA_SIZE); + ASSERT_EQ(TEST_DATA_SIZE * 2, rc2); + rc2 = s.Seek(-((int64_t)TEST_DATA_SIZE), soEnd); + ASSERT_EQ(TEST_DATA_SIZE, rc2); + ASSERT_EQ(s.Size(), TEST_DATA_SIZE * 2); + rc = s.Write(test_data, TEST_DATA_SIZE); + ASSERT_EQ(rc, TEST_DATA_SIZE); + rc = s.Write("\n12", 4); + ASSERT_EQ(rc, 4ul); + rc2 = s.Seek(TEST_DATA_SIZE, soBeginning); + ASSERT_EQ(rc2, TEST_DATA_SIZE); + std::string teststr; + ASSERT_EQ(s.ReadLine(teststr), true); + ASSERT_STREQ(teststr.c_str(), (const char *)test_data); + s.Close(); + } +} + +TEST(AbstractStreamTest, MemoryStream_Test) +{ + MemoryStream s; + uint8_t buf[16]; + size_t rc; + uint64_t rc1, rc2; + + // Check .Write() + rc = s.Write(reinterpret_cast(test_data), TEST_DATA_SIZE); + ASSERT_EQ(rc, TEST_DATA_SIZE); + // Check .Seek() with various origins + rc2 = s.Seek(1, soBeginning); + ASSERT_EQ(rc2, 1ull); + rc2 = s.Seek(2, soCurrent); + ASSERT_EQ(rc2, 3ull); + rc2 = s.Seek(1 - (int64_t)TEST_DATA_SIZE, soEnd); + ASSERT_EQ(rc2, 1ull); + // Check .Tell() + rc1 = s.Tell(); + ASSERT_EQ(rc1, rc2); + // Check .Read(), validate data + rc = s.Read(buf, TEST_DATA_SIZE - 1); + ASSERT_EQ(rc, TEST_DATA_SIZE - 1); + ASSERT_EQ(0, memcmp(buf, &test_data[1], TEST_DATA_SIZE - 1)); //-V512 + // Check .GetSize() + rc2 = s.Size(); + ASSERT_EQ(TEST_DATA_SIZE, rc2); +} + +TEST(AbstractStreamTest, MemoryStream_Copy_Test) +{ + MemoryStream s1, s2; + uint8_t buf[16]; + size_t rc; + uint64_t rc2; + + rc = s1.Write(reinterpret_cast(test_data), TEST_DATA_SIZE); + ASSERT_EQ(rc, TEST_DATA_SIZE); + rc2 = s1.Seek(0, soBeginning); + ASSERT_EQ(rc2, 0ull); + rc = s2.CopyFrom(s1, TEST_DATA_SIZE); + ASSERT_EQ(rc, TEST_DATA_SIZE); + rc2 = s2.Seek(1, soBeginning); + ASSERT_EQ(rc2, 1ull); + rc = s2.Read(buf, TEST_DATA_SIZE - 1); + ASSERT_EQ(rc, TEST_DATA_SIZE - 1); + ASSERT_EQ(0, memcmp(buf, &test_data[1], TEST_DATA_SIZE - 1)); //-V512 +} + +TEST(AbstractStreamTest, FileStream_Copy_Test) +{ + bool status; + for (size_t bufSize = TEST_DATA_SIZE + 3; bufSize > 3; bufSize -= 3) + { + FileStream s1(bufSize), s2(bufSize), s3(bufSize); + status = s1.Open("test1.bin", fmOpenReadWrite | fmShareDenyNone | fmCreate); + ASSERT_TRUE(status); + status = s2.Open("test2.bin", fmOpenReadWrite | fmShareDenyNone | fmCreate); + ASSERT_TRUE(status); + uint8_t buf[16]; + size_t rc; + uint64_t rc2; + + rc = s1.Write(reinterpret_cast(test_data), TEST_DATA_SIZE); + ASSERT_EQ(rc, TEST_DATA_SIZE); + rc2 = s1.Seek(0, soBeginning); + ASSERT_EQ(rc2, 0ull); + rc = s2.CopyFrom(s1, TEST_DATA_SIZE); + ASSERT_EQ(rc, TEST_DATA_SIZE); + status = s3.Open("test2.bin", fmOpenRead | fmShareDenyNone); + ASSERT_TRUE(status); + ASSERT_STREQ(s3.ReadAll().c_str(), (const char *)(test_data)); + rc2 = s2.Seek(1, soBeginning); + ASSERT_EQ(rc2, 1ull); + rc = s2.Read(buf, TEST_DATA_SIZE - 1); + ASSERT_EQ(rc, TEST_DATA_SIZE - 1); + ASSERT_EQ(0, memcmp(buf, &test_data[1], TEST_DATA_SIZE - 1)); //-V512 + s1.Close(); + s2.Close(); + s3.Close(); + } +} + +TEST(Demangle, Demangle_Test) +{ + const struct { + const char *mangled; + const char *demangled; + } names[] = { + // Check some names from Qt. + {"?newCol@QColorPicker@?A0x3be3cb80@@QEAAXHH@Z", "`anonymous namespace'::QColorPicker::newCol(int,int)"}, + {"_ZN9QSettings10beginGroupERK7QString", "QSettings::beginGroup(QString const&)"}, + {"_ZNK10QTableView14verticalHeaderEv", "QTableView::verticalHeader() const"}, + {"_ZNK12QTableWidget20horizontalHeaderItemEi", "QTableWidget::horizontalHeaderItem(int) const"}, + + // Apple names. + {"St9bad_alloc", "std::bad_alloc"}, + {"_ZN1f1fE", "f::f"}, + {"_Z1fv", "f()"}, + {"_Z1fi", "f(int)"}, + {"_Z3foo3bar", "foo(bar)"}, + {"_Zrm1XS_", "operator%(X, X)"}, + {"_ZplR1XS0_", "operator+(X&, X&)"}, + {"_ZlsRK1XS1_", "operator<<(X const&, X const&)"}, + {"_ZN3FooIA4_iE3barE", "Foo::bar"}, + {"_Z1fIiEvi", "void f(int)"}, + {"_Z5firstI3DuoEvS0_", "void first(Duo)"}, + {"_Z5firstI3DuoEvT_", "void first(Duo)"}, + {"_Z3fooIiFvdEiEvv", "void foo()"}, + {"_ZN1N1fE", "N::f"}, + {"_ZN6System5Sound4beepEv", "System::Sound::beep()"}, + {"_ZN5Arena5levelE", "Arena::level"}, + {"_ZN5StackIiiE5levelE", "Stack::level"}, + {"_Z1fI1XEvPVN1AIT_E1TE", "void f(A::T volatile*)"}, + {"_ZngILi42EEvN1AIXplT_Li2EEE1TE", "void operator-<42>(A<(42)+(2)>::T)"}, + {"_Z4makeI7FactoryiET_IT0_Ev", "Factory make()"}, + {"_Z3foo5Hello5WorldS0_S_", "foo(Hello, World, World, Hello)"}, + {"_Z3fooPM2ABi", "foo(int AB::**)"}, + {"_ZlsRSoRKSs", "operator<<(std::ostream&, std::string const&)"}, + {"_ZTI7a_class", "typeinfo for a_class"}, + {"U4_farrVKPi", "int* const volatile restrict _far"}, + {"_Z3fooILi2EEvRAplT_Li1E_i", "void foo<2>(int (&) [(2)+(1)])"}, + {"_Z1fM1AKFvvE", "f(void (A::*)() const)"}, + {"_Z3fooc", "foo(char)"}, + {"2CBIL_Z3foocEE", "CB"}, + {"2CBIL_Z7IsEmptyEE", "CB"}, + {"_ZZN1N1fEiE1p", "N::f(int)::p"}, + {"_ZZN1N1fEiEs", "N::f(int)::string literal"}, + {"_Z1fPFvvEM1SFvvE", "f(void (*)(), void (S::*)())"}, + {"_ZN1N1TIiiE2mfES0_IddE", "N::T::mf(N::T)"}, + {"_ZSt5state", "std::state"}, + {"_ZNSt3_In4wardE", "std::_In::ward"}, + {"_Z1fKPFiiE", "f(int (* const)(int))"}, + {"_Z1fAszL_ZZNK1N1A1fEvE3foo_0E_i", "f(int [sizeof (N::A::f() const::foo)])"}, + {"_Z1fA37_iPS_", "f(int [37], int (*) [37])"}, + {"_Z1fM1AFivEPS0_", "f(int (A::*)(), int (*)())"}, + {"_Z1fPFPA1_ivE", "f(int (*(*)()) [1])"}, + {"_Z1fPKM1AFivE", "f(int (A::* const*)())"}, + {"_Z1jM1AFivEPS1_", "j(int (A::*)(), int (A::**)())"}, + {"_Z1sPA37_iPS0_", "s(int (*) [37], int (**) [37])"}, + {"_Z3fooA30_A_i", "foo(int [30][])"}, + {"_Z3kooPA28_A30_i", "koo(int (*) [28][30])"}, + {"_ZlsRKU3fooU4bart1XS0_", "operator<<(X bart foo const&, X bart)"}, + {"_ZlsRKU3fooU4bart1XS2_", "operator<<(X bart foo const&, X bart foo const)"}, + {"_Z1fM1AKFivE", "f(int (A::*)() const)"}, + {"_Z3absILi11EEvv", "void abs<11>()"}, + {"_ZN1AIfEcvT_IiEEv", "A::operator int()"}, + {"_ZN12libcw_app_ct10add_optionIS_EEvMT_FvPKcES3_cS3_S3_", "void libcw_app_ct::add_option(void (libcw_app_ct::*)(char const*), char const*, char, char const*, char const*)"}, + {"_ZGVN5libcw24_GLOBAL__N_cbll.cc0ZhUKa23compiler_bug_workaroundISt6vectorINS_13omanip_id_tctINS_5debug32memblk_types_manipulator_data_ctEEESaIS6_EEE3idsE", "guard variable for libcw::(anonymous namespace)::compiler_bug_workaround, std::allocator > > >::ids"}, + {"_ZN5libcw5debug13cwprint_usingINS_9_private_12GlobalObjectEEENS0_17cwprint_using_tctIT_EERKS5_MS5_KFvRSt7ostreamE", "libcw::debug::cwprint_using_tct libcw::debug::cwprint_using(libcw::_private_::GlobalObject const&, void (libcw::_private_::GlobalObject::*)(std::ostream&) const)"}, + {"_ZNKSt14priority_queueIP27timer_event_request_base_ctSt5dequeIS1_SaIS1_EE13timer_greaterE3topEv", "std::priority_queue >, timer_greater>::top() const"}, + {"_ZNKSt15_Deque_iteratorIP15memory_block_stRKS1_PS2_EeqERKS5_", "std::_Deque_iterator::operator==(std::_Deque_iterator const&) const"}, + {"_ZNKSt17__normal_iteratorIPK6optionSt6vectorIS0_SaIS0_EEEmiERKS6_", "std::__normal_iterator