From 5ca446888656da91165b7bf90b7b2195d1e1afac Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Mon, 21 Oct 2019 15:32:13 -0400 Subject: `Repro` functionality (#1085) * WIP on serialize/save state. * Relative string encoding. * Added RelativeContainer unit test. Split out RelativeContainer into core. * Fix bug in RelativeString encoding. * More work around relative container. * Fix checks. * Use RelativeBase for safe access. Use malloc/free/realloc instead of List. * Add natvis support for relative types. * Setting up of state (not includes) writing of repro state. * Capture after spCompile. * Writing SourceFile and file system files. Added -dump-repo * First pass at loading state. * First pass at reading repro. * Small optimization around Safe32Ptr * Refactor how repro data is stored - to make saving off the files more simple, by having all all backed by 'files'. Make file loading always set up PathInfo so we get uniqueIdentifier info. * Generate unique file names. * Added RelativeFileSystem Added saveFile to ISlangFileSystemExt and implemented for interfaces Added mechanism to save of files (and manifest) * Added ability to replace files in repo with directory holding their contents. * Add support for entry points. * Fix problem compiling on linux. * Added SIMPLE_EX option, where everything on command line must be specified. * Fix typo in unit test for relative container. * Fix another typo in unit test for RelativeContainer. * Fix small bugs. * Fix release unused variable issue in slang-state-serialize.cpp * Fix checking for SIMPLE_EX in testing, else broke COMMAND_LINE_SIMPLE. * Fix warnings on 32 bit debug build. * Added import-subdir-search-path-repro.slang test. Although disabled for now as writes to root of slang project. * Remove wrong version of import-subdir-search-path-repro.slang * Added import-subdir-search-path-repro.slang --- tools/slang-test/unit-relative-container.cpp | 94 ++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 tools/slang-test/unit-relative-container.cpp (limited to 'tools/slang-test/unit-relative-container.cpp') diff --git a/tools/slang-test/unit-relative-container.cpp b/tools/slang-test/unit-relative-container.cpp new file mode 100644 index 000000000..4ecd18dba --- /dev/null +++ b/tools/slang-test/unit-relative-container.cpp @@ -0,0 +1,94 @@ +// unit-test-path.cpp + +#include "../../source/core/slang-relative-container.h" + +#include "test-context.h" + +using namespace Slang; + +static void _checkEncodeDecode(uint32_t size) +{ + uint8_t encode[RelativeString::kMaxSizeEncodeSize]; + + size_t encodeSize = RelativeString::calcEncodedSize(size, encode); + + size_t decodedSize; + const char* chars = RelativeString::decodeSize((const char*)encode, decodedSize); + + SLANG_CHECK(decodedSize == size); + SLANG_CHECK(chars - (const char*)encode == encodeSize); +} + +namespace { // anonymous + +struct Root +{ + Relative32Array > dirs; + Relative32Ptr name; + float value; +}; + +} // anonymous + +static void relativeContainerUnitTest() +{ + _checkEncodeDecode(253); + + for (int64_t i = 0; i < 0x100000000; i += (i / 2) + 1) + { + _checkEncodeDecode(uint32_t(i)); + } + + { + RelativeContainer container; + + const char* strings[] = + { + "Hello", + "World", + nullptr, + }; + + { + Safe32Ptr root = container.allocate(); + + auto array = container.allocateArray>(SLANG_COUNT_OF(strings)); + for (Int i = 0; i < SLANG_COUNT_OF(strings); ++i) + { + array[i] = container.newString(strings[i]); + } + + root->dirs = array; + } + + { + RelativeContainer copy; + copy.set(container.getData(), container.getDataCount()); + + Root* root = (Root*)copy.getData(); + + SLANG_CHECK(root->dirs.getCount() == SLANG_COUNT_OF(strings)); + + Int count = root->dirs.getCount(); + for (Int i = 0; i < count; ++i) + { + RelativeString* str = root->dirs[i]; + + const char* check = strings[i]; + + if (check) + { + SLANG_CHECK(str != nullptr); + const char* strCstr = str->getCstr(); + SLANG_CHECK(strcmp(strCstr, check) == 0); + } + else + { + SLANG_CHECK(str == nullptr); + } + } + } + } +} + +SLANG_UNIT_TEST("RelativeContainer", relativeContainerUnitTest); -- cgit v1.2.3