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
72
73
74
#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";

  SCENARIO(transcoding, transcode_utf8_to_utf16) {
    {
      auto const result { transcoding::transcode_utf8_to_utf16(LATIN_CAPITAL_LETTER_A_UTF8) };
      EXPECT_RHS(result);
      EXPECT_EQ(result.get_rhs(), LATIN_CAPITAL_LETTER_A_UTF16);
    }

    {
      auto const result { transcoding::transcode_utf8_to_utf16(GREEK_SMALL_LETTER_LAMBDA_UTF8) };
      EXPECT_RHS(result);
      EXPECT_EQ(result.get_rhs(), GREEK_SMALL_LETTER_LAMBDA_UTF16);
    }

    {
      auto const result { transcoding::transcode_utf8_to_utf16(ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF8) };
      EXPECT_RHS(result);
      EXPECT_EQ(result.get_rhs(), ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF16);
    }
  }

  SCENARIO(transcoding, invalid_utf8) {
    auto const result { transcoding::transcode_utf8_to_utf16(INVALID_UTF8) };
    EXPECT_LHS(result);
    EXPECT(result.get_lhs().is<errors::MultiByteToWideCharFailed>());
  }

  SCENARIO(transcoding, transcode_utf16_to_utf8) {
    {
      auto const result { transcoding::transcode_utf16_to_utf8(LATIN_CAPITAL_LETTER_A_UTF16) };
      EXPECT_RHS(result);
      EXPECT_EQ(result.get_rhs(), LATIN_CAPITAL_LETTER_A_UTF8);
    }

    {
      auto const result { transcoding::transcode_utf16_to_utf8(GREEK_SMALL_LETTER_LAMBDA_UTF16) };
      EXPECT_RHS(result);
      EXPECT_EQ(result.get_rhs(), GREEK_SMALL_LETTER_LAMBDA_UTF8);
    }

    {
      auto const result { transcoding::transcode_utf16_to_utf8(ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF16) };
      EXPECT_RHS(result);
      EXPECT_EQ(result.get_rhs(), ALCHEMICAL_SYMBOL_FOR_ROCK_SALT_UTF8);
    }
  }

  SCENARIO(transcoding, invalid_utf16) {
    auto const result { transcoding::transcode_utf16_to_utf8(INVALID_UTF16) };
    EXPECT_LHS(result);
    EXPECT(result.get_lhs().is<errors::WideCharToMultiByteFailed>());
  }
}