src/util/test/string-parser.c (view raw)
1/* Copyright (c) 2013-2019 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#include "util/test/suite.h"
7
8#include <mgba-util/string.h>
9
10M_TEST_DEFINE(nullString) {
11 const char* unparsed = "";
12 char parsed[2];
13 assert_int_equal(parseQuotedString(unparsed, 1, parsed, sizeof(parsed)), -1);
14}
15
16M_TEST_DEFINE(emptyString2) {
17 const char* unparsed = "\"\"";
18 char parsed[2];
19 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), 0);
20}
21
22M_TEST_DEFINE(emptyString) {
23 const char* unparsed = "''";
24 char parsed[2];
25 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), 0);
26}
27
28M_TEST_DEFINE(plainString) {
29 const char* unparsed = "\"plain\"";
30 char parsed[32];
31 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), strlen("plain"));
32 assert_string_equal(parsed, "plain");
33}
34
35M_TEST_DEFINE(plainString2) {
36 const char* unparsed = "\"plain\"";
37 char parsed[32];
38 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed), parsed, sizeof(parsed)), strlen("plain"));
39 assert_string_equal(parsed, "plain");
40}
41
42M_TEST_DEFINE(trailingString) {
43 const char* unparsed = "\"trailing\"T";
44 char parsed[32];
45 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), strlen("trailing"));
46 assert_string_equal(parsed, "trailing");
47}
48
49M_TEST_DEFINE(leadingString) {
50 const char* unparsed = "L\"leading\"";
51 char parsed[32];
52 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), -1);
53}
54
55M_TEST_DEFINE(backslashString) {
56 const char* unparsed = "\"back\\\\slash\"";
57 char parsed[32];
58 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), strlen("back\\slash"));
59 assert_string_equal(parsed, "back\\slash");
60}
61
62M_TEST_DEFINE(doubleBackslashString) {
63 const char* unparsed = "\"back\\\\\\\\slash\"";
64 char parsed[32];
65 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), strlen("back\\\\slash"));
66 assert_string_equal(parsed, "back\\\\slash");
67}
68
69M_TEST_DEFINE(escapeCharsString) {
70 const char* unparsed = "\"\\\"\\'\\n\\r\\\\\"";
71 char parsed[32];
72 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), strlen("\"'\n\r\\"));
73 assert_string_equal(parsed, "\"'\n\r\\");
74}
75
76M_TEST_DEFINE(invalidEscapeCharString) {
77 const char* unparsed = "\"\\z\"";
78 char parsed[32];
79 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), -1);
80}
81
82M_TEST_DEFINE(overflowString) {
83 const char* unparsed = "\"longstring\"";
84 char parsed[4];
85 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), -1);
86}
87
88M_TEST_DEFINE(unclosedString) {
89 const char* unparsed = "\"forever";
90 char parsed[32];
91 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), -1);
92}
93
94M_TEST_DEFINE(unclosedString2) {
95 const char* unparsed = "\"forever";
96 char parsed[32];
97 assert_int_equal(parseQuotedString(unparsed, 4, parsed, sizeof(parsed)), -1);
98}
99
100M_TEST_DEFINE(unclosedBackslashString) {
101 const char* unparsed = "\"backslash\\";
102 char parsed[32];
103 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed), parsed, sizeof(parsed)), -1);
104}
105
106M_TEST_DEFINE(unclosedBackslashString2) {
107 const char* unparsed = "\"backslash\\";
108 char parsed[32];
109 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), -1);
110}
111
112M_TEST_DEFINE(highCharacterString) {
113 const char* unparsed = "\"\200\"";
114 char parsed[32];
115 assert_int_equal(parseQuotedString(unparsed, strlen(unparsed) + 1, parsed, sizeof(parsed)), 1);
116 assert_string_equal(parsed, "\200");
117}
118
119M_TEST_SUITE_DEFINE(StringParser,
120 cmocka_unit_test(nullString),
121 cmocka_unit_test(emptyString),
122 cmocka_unit_test(emptyString2),
123 cmocka_unit_test(plainString),
124 cmocka_unit_test(plainString2),
125 cmocka_unit_test(leadingString),
126 cmocka_unit_test(trailingString),
127 cmocka_unit_test(backslashString),
128 cmocka_unit_test(doubleBackslashString),
129 cmocka_unit_test(escapeCharsString),
130 cmocka_unit_test(invalidEscapeCharString),
131 cmocka_unit_test(overflowString),
132 cmocka_unit_test(unclosedString),
133 cmocka_unit_test(unclosedString2),
134 cmocka_unit_test(unclosedBackslashString),
135 cmocka_unit_test(unclosedBackslashString2),
136 cmocka_unit_test(highCharacterString))