| @@ -5,4 +5,6 @@ Depends: neo-buffer 0.1.0 | |||
| Depends: spdlog 1.4.2 | |||
| Depends: ms-wil 2019.11.10 | |||
| Depends: range-v3 0.9.1 | |||
| Depends: nlohmann-json 3.7.1 | |||
| Depends: nlohmann-json 3.7.1 | |||
| Test-Driver: Catch-Main | |||
| @@ -3,33 +3,28 @@ | |||
| #include <browns/output.hpp> | |||
| #include <neo/buffer.hpp> | |||
| #include <catch2/catch.hpp> | |||
| #include <iostream> | |||
| int check_hash(std::string_view str, std::string_view expect_md5) { | |||
| auto md5_hash_str(std::string_view s) { | |||
| browns::md5 hash; | |||
| hash.feed(neo::buffer(str)); | |||
| hash.feed(neo::buffer(s)); | |||
| hash.pad(); | |||
| auto dig = hash.digest(); | |||
| auto dig_str = browns::format_digest(dig); | |||
| if (dig_str != expect_md5) { | |||
| std::cerr << "Hash of '" << str << "' did not match. Expected '" << expect_md5 | |||
| << "', but got '" << dig_str << "'\n"; | |||
| return 1; | |||
| } | |||
| return 0; | |||
| return browns::format_digest(hash.digest()); | |||
| } | |||
| int main() { | |||
| browns::md5 hash; | |||
| void check_hash(std::string_view str, std::string_view digest) { | |||
| INFO("Hashed string: " << str); | |||
| CHECK(md5_hash_str(str) == digest); | |||
| } | |||
| int n_fails = 0; | |||
| n_fails += check_hash("1234abcd1234abcd1234abcd1234abcd", "67aa636d72b967157c363f0acdf7011b"); | |||
| n_fails += check_hash("The quick brown fox jumps over the lazy dog", | |||
| "9e107d9d372bb6826bd81d3542a419d6"); | |||
| n_fails += check_hash("", "d41d8cd98f00b204e9800998ecf8427e"); | |||
| n_fails += check_hash( | |||
| TEST_CASE("Known hashes") { | |||
| check_hash("1234abcd1234abcd1234abcd1234abcd", "67aa636d72b967157c363f0acdf7011b"); | |||
| check_hash("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6"); | |||
| check_hash("", "d41d8cd98f00b204e9800998ecf8427e"); | |||
| check_hash( | |||
| "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", | |||
| "967ce152b23edc20ebd23b7eba57277c"); | |||
| n_fails += check_hash("WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "9aff577d3248b8889b22f24ee9665c17"); | |||
| return n_fails; | |||
| check_hash("WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "9aff577d3248b8889b22f24ee9665c17"); | |||
| } | |||
| @@ -2,39 +2,29 @@ | |||
| #include <dds/proc.hpp> | |||
| #include <dds/util.test.hpp> | |||
| // #include <dds/util.test.hpp> | |||
| #include <catch2/catch.hpp> | |||
| namespace { | |||
| void check_tc_compile(std::string_view tc_content, | |||
| std::string_view compile, | |||
| std::string_view compile_warnings, | |||
| std::string_view ar, | |||
| std::string_view exe) { | |||
| std::string_view expected_compile, | |||
| std::string_view expected_compile_warnings, | |||
| std::string_view expected_ar, | |||
| std::string_view expected_exe) { | |||
| auto tc = dds::parse_toolchain_dds(tc_content); | |||
| bool any_error = false; | |||
| dds::compile_file_spec cf; | |||
| cf.source_path = "foo.cpp"; | |||
| cf.out_path = "foo.o"; | |||
| auto cf_cmd = tc.create_compile_command(cf); | |||
| auto cf_cmd_str = dds::quote_command(cf_cmd); | |||
| if (cf_cmd_str != compile) { | |||
| std::cerr << "Compile command came out incorrect!\n"; | |||
| std::cerr << " Expected: " << compile << '\n'; | |||
| std::cerr << " Actual: " << cf_cmd_str << "\n\n"; | |||
| any_error = true; | |||
| } | |||
| CHECK(cf_cmd_str == expected_compile); | |||
| cf.enable_warnings = true; | |||
| cf_cmd = tc.create_compile_command(cf); | |||
| cf_cmd_str = dds::quote_command(cf_cmd); | |||
| if (cf_cmd_str != compile_warnings) { | |||
| std::cerr << "Compile command (with warnings) came out incorrect!\n"; | |||
| std::cerr << " Expected: " << compile_warnings << '\n'; | |||
| std::cerr << " Actual: " << cf_cmd_str << "\n\n"; | |||
| any_error = true; | |||
| } | |||
| CHECK(cf_cmd_str == expected_compile_warnings); | |||
| dds::archive_spec ar_spec; | |||
| ar_spec.input_files.push_back("foo.o"); | |||
| @@ -42,12 +32,7 @@ void check_tc_compile(std::string_view tc_content, | |||
| ar_spec.out_path = "stuff.a"; | |||
| auto ar_cmd = tc.create_archive_command(ar_spec); | |||
| auto ar_cmd_str = dds::quote_command(ar_cmd); | |||
| if (ar_cmd_str != ar) { | |||
| std::cerr << "Archive command came out incorrect!\n"; | |||
| std::cerr << " Expected: " << ar << '\n'; | |||
| std::cerr << " Actual: " << ar_cmd_str << "\n\n"; | |||
| any_error = true; | |||
| } | |||
| CHECK(ar_cmd_str == expected_ar); | |||
| dds::link_exe_spec exe_spec; | |||
| exe_spec.inputs.push_back("foo.o"); | |||
| @@ -55,20 +40,10 @@ void check_tc_compile(std::string_view tc_content, | |||
| exe_spec.output = "meow.exe"; | |||
| auto exe_cmd = tc.create_link_executable_command(exe_spec); | |||
| auto exe_cmd_str = dds::quote_command(exe_cmd); | |||
| if (exe_cmd_str != exe) { | |||
| std::cerr << "Executable linking command came out incorrect!\n"; | |||
| std::cerr << " Expected: " << exe << '\n'; | |||
| std::cerr << " Actual: " << exe_cmd_str << "\n\n"; | |||
| any_error = true; | |||
| } | |||
| if (any_error) { | |||
| std::cerr << "The error-producing toolchain file content:\n" << tc_content << '\n'; | |||
| dds::S_failed_checks++; | |||
| } | |||
| CHECK(exe_cmd_str == expected_exe); | |||
| } | |||
| void run_tests() { | |||
| TEST_CASE("Generating toolchain commands") { | |||
| check_tc_compile("Compiler-ID: GNU", | |||
| "g++ -fPIC -fdiagnostics-color -pthread -c foo.cpp -ofoo.o", | |||
| "g++ -fPIC -fdiagnostics-color -pthread -Wall -Wextra -Wpedantic -Wconversion " | |||
| @@ -151,5 +126,3 @@ void run_tests() { | |||
| } | |||
| } // namespace | |||
| DDS_TEST_MAIN; | |||
| @@ -1,17 +1,13 @@ | |||
| #include <dds/toolchain/toolchain.hpp> | |||
| #include <dds/util.test.hpp> | |||
| using namespace dds; | |||
| namespace { | |||
| #include <catch2/catch.hpp> | |||
| #define CHECK_SHLEX(str, ...) \ | |||
| do { \ | |||
| CHECK(dds::split_shell_string(str) == std::vector<std::string>(__VA_ARGS__)); \ | |||
| INFO("Shell-lexing string: '" << str << "'"); CHECK(dds::split_shell_string(str) == std::vector<std::string>(__VA_ARGS__)); \ | |||
| } while (0) | |||
| void test_shlex() { | |||
| TEST_CASE("Shell lexer") { | |||
| CHECK_SHLEX("foo", {"foo"}); | |||
| CHECK_SHLEX("foo bar", {"foo", "bar"}); | |||
| CHECK_SHLEX("\"foo\" bar", {"foo", "bar"}); | |||
| @@ -27,9 +23,3 @@ void test_shlex() { | |||
| CHECK_SHLEX("Foo\nBar", {"Foo", "Bar"}); | |||
| CHECK_SHLEX("foo \"\" bar", {"foo", "", "bar"}); | |||
| } | |||
| void run_tests() { test_shlex(); } | |||
| } // namespace | |||
| DDS_TEST_MAIN; | |||
| @@ -1,44 +0,0 @@ | |||
| #pragma once | |||
| #include <iostream> | |||
| namespace dds { | |||
| int S_failed_checks = 0; | |||
| struct requirement_failed {}; | |||
| #define CHECK(...) \ | |||
| do { \ | |||
| if (!(__VA_ARGS__)) { \ | |||
| ++::dds::S_failed_checks; \ | |||
| std::cerr << "Check failed at " << __FILE__ << ':' << __LINE__ << ": " << #__VA_ARGS__ \ | |||
| << "\n"; \ | |||
| } \ | |||
| } while (0) | |||
| #define REQUIRE(...) \ | |||
| do { \ | |||
| if (!(__VA_ARGS__)) { \ | |||
| ++::dds::S_failed_checks; \ | |||
| std::cerr << "Check failed at " << __FILE__ << ':' << __LINE__ << ": " << #__VA_ARGS__ \ | |||
| << "\n"; \ | |||
| throw ::dds::requirement_failed(); \ | |||
| } \ | |||
| } while (0) | |||
| #define DDS_TEST_MAIN \ | |||
| int main() { \ | |||
| try { \ | |||
| run_tests(); \ | |||
| } catch (const ::dds::requirement_failed&) { \ | |||
| return ::dds::S_failed_checks; \ | |||
| } catch (const std::exception& e) { \ | |||
| std::cerr << "An unhandled exception occured: " << e.what() << '\n'; \ | |||
| return 2; \ | |||
| } \ | |||
| return ::dds::S_failed_checks; \ | |||
| } \ | |||
| static_assert(true) | |||
| } // namespace dds | |||
| @@ -1,17 +1,15 @@ | |||
| #include <dds/util/string.hpp> | |||
| #include <dds/util.test.hpp> | |||
| #include <catch2/catch.hpp> | |||
| using namespace dds; | |||
| namespace { | |||
| #define CHECK_SPLIT(str, key, ...) \ | |||
| do { \ | |||
| CHECK(dds::split(str, key) == std::vector<std::string>(__VA_ARGS__)); \ | |||
| } while (0) | |||
| void test_starts_with() { | |||
| TEST_CASE("starts_with") { | |||
| CHECK(starts_with("foo", "foo")); | |||
| CHECK(starts_with("foo.bar", "foo")); | |||
| CHECK(starts_with("foo", "f")); | |||
| @@ -22,7 +20,7 @@ void test_starts_with() { | |||
| CHECK(!starts_with("foo.bar", "bar")); | |||
| } | |||
| void test_ends_with() { | |||
| TEST_CASE("ends_with") { | |||
| CHECK(ends_with("foo", "foo")); | |||
| CHECK(ends_with("foo.bar", "bar")); | |||
| CHECK(ends_with("foo", "o")); | |||
| @@ -33,34 +31,22 @@ void test_ends_with() { | |||
| CHECK(!ends_with("foo.bar", "foo")); | |||
| } | |||
| void test_trim() { | |||
| TEST_CASE( "trim" ) { | |||
| CHECK(trim_view("foo") == "foo"); | |||
| CHECK(trim_view("foo ") == "foo"); | |||
| CHECK(trim_view(" ").size() == 0); | |||
| } | |||
| void test_contains() { | |||
| TEST_CASE( "contains" ) { | |||
| CHECK(contains("foo", "foo")); | |||
| CHECK(contains("foo", "")); | |||
| CHECK(contains("foo", "o")); | |||
| CHECK(!contains("foo", "bar")); | |||
| } | |||
| void test_split() { | |||
| TEST_CASE( "split" ) { | |||
| CHECK_SPLIT("foo.bar", ".", {"foo", "bar"}); | |||
| CHECK_SPLIT("foo.bar.baz", ".", {"foo", "bar", "baz"}); | |||
| CHECK_SPLIT(".", ".", {"", ""}); | |||
| CHECK_SPLIT("", ",", {""}); | |||
| } | |||
| void run_tests() { | |||
| test_trim(); | |||
| test_starts_with(); | |||
| test_ends_with(); | |||
| test_contains(); | |||
| test_split(); | |||
| } | |||
| } // namespace | |||
| DDS_TEST_MAIN; | |||
| @@ -1,11 +1,12 @@ | |||
| #include <dds/util.test.hpp> | |||
| #include <libman/parse.hpp> | |||
| #include <catch2/catch.hpp> | |||
| #include <iostream> | |||
| using namespace lm; | |||
| void test_simple() { | |||
| TEST_CASE("Simple") { | |||
| auto lm_src = ""; | |||
| auto kvs = parse_string(lm_src); | |||
| CHECK(kvs.size() == 0); | |||
| @@ -55,7 +56,7 @@ void test_simple() { | |||
| CHECK(kvs.find("foo")->value == "# Not a comment"); | |||
| } | |||
| void test_multi() { | |||
| TEST_CASE("Multiple") { | |||
| auto kvs = parse_string("Foo: bar\nbaz: qux"); | |||
| CHECK(kvs.size() == 2); | |||
| REQUIRE(kvs.find("Foo")); | |||
| @@ -80,8 +81,9 @@ void test_multi() { | |||
| CHECK(!iter); | |||
| } | |||
| void test_nested_kvlist() { | |||
| TEST_CASE("Nested kv-lists") { | |||
| auto check_1 = [](auto str) { | |||
| INFO("Testing string: '" << str << "'"); | |||
| auto result = nested_kvlist::parse(str); | |||
| CHECK(result.primary == "Foo"); | |||
| CHECK(result.pairs.size() == 1); | |||
| @@ -96,6 +98,7 @@ void test_nested_kvlist() { | |||
| check_1("Foo;bar=baz"); | |||
| auto check_2 = [](auto str) { | |||
| INFO("Testing string: '" << str << "'"); | |||
| auto result = nested_kvlist::parse(str); | |||
| CHECK(result.primary == "Foo"); | |||
| CHECK(result.pairs.size() == 0); | |||
| @@ -107,6 +110,7 @@ void test_nested_kvlist() { | |||
| check_2("Foo; "); | |||
| auto check_3 = [](auto str) { | |||
| INFO("Testing string: '" << str << "'"); | |||
| auto result = nested_kvlist::parse(str); | |||
| CHECK(result.primary == "Foo bar"); | |||
| CHECK(result.pairs.size() == 2); | |||
| @@ -121,11 +125,3 @@ void test_nested_kvlist() { | |||
| check_3("Foo bar ; quux= baz=meow"); | |||
| check_3("Foo bar ;quux= baz=meow"); | |||
| } | |||
| void run_tests() { | |||
| test_simple(); | |||
| test_multi(); | |||
| test_nested_kvlist(); | |||
| } | |||
| DDS_TEST_MAIN; | |||
| @@ -1,38 +0,0 @@ | |||
| #include <neo/buffer.hpp> | |||
| #include <neo/buffer.test.hpp> | |||
| #include <neo/buffer_algorithm.hpp> | |||
| #include <array> | |||
| #include <string> | |||
| struct my_simple_struct { | |||
| int a; | |||
| int b; | |||
| }; | |||
| int main() { | |||
| // std::string s = "I am a string!"; | |||
| // auto s_buf = neo::buffer(s); | |||
| // CHECK(s_buf.data() == s.data()); | |||
| my_simple_struct foo; | |||
| foo.a = 12; | |||
| foo.b = 3; | |||
| neo::mutable_buffer pod_buf = neo::buffer(foo); | |||
| CHECK(pod_buf.size() == sizeof(foo)); | |||
| my_simple_struct bar; | |||
| neo::buffer_copy(neo::buffer(bar), pod_buf); | |||
| CHECK(bar.a == foo.a); | |||
| CHECK(bar.b == foo.b); | |||
| bar.b = 55; | |||
| std::array<char, sizeof bar> buf; | |||
| neo::buffer_copy(neo::buffer(buf), neo::buffer(bar)); | |||
| neo::buffer_copy(neo::buffer(foo), neo::buffer(buf)); | |||
| CHECK(foo.b == 55); | |||
| } | |||
| @@ -1,11 +0,0 @@ | |||
| #pragma once | |||
| #include <iostream> | |||
| #define CHECK(...) \ | |||
| do { \ | |||
| if (!(__VA_ARGS__)) { \ | |||
| std::cerr << "Check failed: " << (#__VA_ARGS__) << '\n'; \ | |||
| return 1; \ | |||
| } \ | |||
| } while (0) | |||
| @@ -1,18 +0,0 @@ | |||
| #include <neo/buffer_algorithm.hpp> | |||
| #include <neo/buffer.test.hpp> | |||
| #include <neo/const_buffer.hpp> | |||
| #include <string_view> | |||
| int main() { | |||
| auto buf = neo::const_buffer("A string"); | |||
| auto buf_iter = neo::buffer_sequence_begin(buf); | |||
| CHECK(buf_iter->data() == buf.data()); | |||
| CHECK(buf_iter != neo::buffer_sequence_end(buf)); | |||
| CHECK(neo::buffer_size(buf) == buf.size()); | |||
| // neo::buffer_size(12); | |||
| } | |||
| @@ -1,17 +0,0 @@ | |||
| #include <neo/buffer.test.hpp> | |||
| #include <neo/const_buffer.hpp> | |||
| #include <iostream> | |||
| int main() { | |||
| neo::const_buffer buf; | |||
| CHECK(buf.size() == 0); | |||
| buf = neo::const_buffer("meow"); | |||
| CHECK(buf.size() == 4); | |||
| auto buf2 = buf + 3; | |||
| CHECK(buf2.size() == 1); | |||
| CHECK(buf2.data()[0] == std::byte('w')); | |||
| buf2 += 1; | |||
| CHECK(buf2.size() == 0); | |||
| } | |||
| @@ -1,3 +0,0 @@ | |||
| #include <neo/mutable_buffer.hpp> | |||
| int main() {} | |||
| @@ -1,10 +1,8 @@ | |||
| #include "./version.hpp" | |||
| #include <dds/util.test.hpp> | |||
| #include <catch2/catch.hpp> | |||
| namespace { | |||
| void test_simple_parse() { | |||
| TEST_CASE("Parsing") { | |||
| auto v1 = semver::version::parse("1.2.3"); | |||
| CHECK(v1.major == 1); | |||
| CHECK(v1.minor == 2); | |||
| @@ -16,9 +14,3 @@ void test_simple_parse() { | |||
| v1.major = 999999; | |||
| CHECK(v1.to_string() == "999999.2.55"); | |||
| } | |||
| void run_tests() { test_simple_parse(); } | |||
| } // namespace | |||
| DDS_TEST_MAIN; | |||