Echo Writes Code

test_transcoding.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "crucible/windows/transcoding.hpp"

#include "crucible/testing/expect.inl"
#include "crucible/testing/suite.hpp"

namespace crucible::windows::test_transcoding {
  constexpr char const LATIN_CAPITAL_LETTER_A_UTF8[] = "A";

  constexpr char const GREEK_SMALL_LETTER_LAMBDA_UTF8[] = "\xce\xbb";

  constexpr char const ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF8[] = "\xf0\x9f\x9c\x98";

  constexpr char const INVALID_UTF8[] = "\x80";

  constexpr const wchar_t LATIN_CAPITAL_LETTER_A_UTF16[] = L"A";

  constexpr const wchar_t GREEK_SMALL_LETTER_LAMBDA_UTF16[] = L"\x03bb";

  constexpr const wchar_t ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF16[] = L"\xd83d\xdf18";

  constexpr const wchar_t INVALID_UTF16[] = L"\xDF00";

  CRUCIBLE_SCENARIO(transcoding, transcode_utf8_to_utf16_singlet) {
    auto const result { transcoding::transcode_utf8_to_utf16(LATIN_CAPITAL_LETTER_A_UTF8) };
    CRUCIBLE_EXPECT_SUCCESS(result);
    CRUCIBLE_EXPECT_EQ(result.get_success(), LATIN_CAPITAL_LETTER_A_UTF16);
  }

  CRUCIBLE_SCENARIO(transcoding, transcode_utf8_to_utf16_doublet) {
    auto const result { transcoding::transcode_utf8_to_utf16(GREEK_SMALL_LETTER_LAMBDA_UTF8) };
    CRUCIBLE_EXPECT_SUCCESS(result);
    CRUCIBLE_EXPECT_EQ(result.get_success(), GREEK_SMALL_LETTER_LAMBDA_UTF16);
  }

  CRUCIBLE_SCENARIO(transcoding, transcode_utf8_to_utf16_quadruplet) {
    auto const result { transcoding::transcode_utf8_to_utf16(ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF8) };
    CRUCIBLE_EXPECT_SUCCESS(result);
    CRUCIBLE_EXPECT_EQ(result.get_success(), ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF16);
  }

  CRUCIBLE_SCENARIO(transcoding, invalid_utf8) {
    auto const result { transcoding::transcode_utf8_to_utf16(INVALID_UTF8) };
    CRUCIBLE_EXPECT_FAILURE(result);
    CRUCIBLE_EXPECT(result.get_failure().has<windows::errors::MultiByteToWideCharFailed>());
  }

  CRUCIBLE_SCENARIO(transcoding, transcode_utf16_to_utf8_singlet)
  {
    auto const result { transcoding::transcode_utf16_to_utf8(LATIN_CAPITAL_LETTER_A_UTF16) };
    CRUCIBLE_EXPECT_SUCCESS(result);
    CRUCIBLE_EXPECT_EQ(result.get_success(), LATIN_CAPITAL_LETTER_A_UTF8);
  }

  CRUCIBLE_SCENARIO(transcoding, transcode_utf16_to_utf8_doublet) {
    auto const result { transcoding::transcode_utf16_to_utf8(GREEK_SMALL_LETTER_LAMBDA_UTF16) };
    CRUCIBLE_EXPECT_SUCCESS(result);
    CRUCIBLE_EXPECT_EQ(result.get_success(), GREEK_SMALL_LETTER_LAMBDA_UTF8);
  }

  CRUCIBLE_SCENARIO(transcoding, transcode_utf16_to_utf8_quadruplet) {
    auto const result { transcoding::transcode_utf16_to_utf8(ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF16) };
    CRUCIBLE_EXPECT_SUCCESS(result);
    CRUCIBLE_EXPECT_EQ(result.get_success(), ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF8);
  }

  CRUCIBLE_SCENARIO(transcoding, invalid_utf16) {
    auto const result { transcoding::transcode_utf16_to_utf8(INVALID_UTF16) };
    CRUCIBLE_EXPECT_FAILURE(result);
    CRUCIBLE_EXPECT(result.get_failure().has<windows::errors::WideCharToMultiByteFailed>());
  }
}