GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
string_util_test.h
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
8#ifndef DESIGNLAB_STRING_UTIL_TEST_H_
9#define DESIGNLAB_STRING_UTIL_TEST_H_
10
11#include <doctest.h>
12
13#include <string>
14#include <vector>
15
16#include "string_util.h"
17
18
19
20TEST_SUITE("string_util::Split")
21{
22 std::string StringVectorToString(const std::vector<std::string>&str_vec)
23 {
24 std::string str = "[";
25
26 for (const auto& s : str_vec)
27 {
28 str += s + "]・[";
29 }
30
31 str += "]";
32
33 return str;
34 }
35
36 TEST_CASE("カンマで区切った時,カンマが取り除かれ区切られた文字列に分けられるべき")
37 {
38 SUBCASE("文字列「a,b,c」をカンマで区切った時,「a」「b」「c」に分けられるべき")
39 {
40 const std::string str = "a,b,c";
41 const std::string delim = ",";
42
43 const std::vector<std::string> ans = { "a", "b", "c" };
44 const std::vector<std::string> result = designlab::string_util::Split(str, delim);
45
46 INFO("分割された文字列は次の通りです." << StringVectorToString(result));
47
48 CHECK(result == ans);
49 }
50
51 SUBCASE("文字列「a,b,c,」をカンマで区切った時,「a」「b」「c」に分けられるべき")
52 {
53 const std::string str = "a,b,c,";
54 const std::string delim = ",";
55
56 const std::vector<std::string> ans = { "a", "b", "c" };
57 const std::vector<std::string> result = designlab::string_util::Split(str, delim);
58
59 INFO("分割された文字列は次の通りです." << StringVectorToString(result));
60
61 CHECK(result == ans);
62 }
63
64 SUBCASE("文字列「,a,b,c」をカンマで区切った時,「」「a」「b」「c」に分けられるべき")
65 {
66 const std::string str = ",a,b,c";
67 const std::string delim = ",";
68
69 const std::vector<std::string> ans = { "", "a", "b", "c" };
70 const std::vector<std::string> result = designlab::string_util::Split(str, delim);
71
72 INFO("分割された文字列は次の通りです." << StringVectorToString(result));
73
74 CHECK(result == ans);
75 }
76 }
77}
78
79TEST_SUITE("string_util::EnumToStringRemoveTopK")
80{
81 enum class SampleEnum : int
82 {
83 kOne,
84 knight,
85 three,
86 FOUR,
87 Five
88 };
89
90 TEST_CASE("先頭にkがついた列挙体の要素を渡した時,先頭のkを取り除いた要素名が返るべき")
91 {
92 SUBCASE("「kOne」を渡した時,文字列「One」が返るべき")
93 {
94 const SampleEnum sample_enum = SampleEnum::kOne;
95 const std::string expect = "One";
96 const std::string actual = designlab::string_util::EnumToStringRemoveTopK(sample_enum);
97
98 INFO("変換された文字列は次の通りです." << actual);
99
100 CHECK(actual == expect);
101 }
102
103 SUBCASE("「knight」を渡した時,文字列「night」が返るべき")
104 {
105 const SampleEnum sample_enum = SampleEnum::knight;
106 const std::string expect = "night";
107 const std::string actual = designlab::string_util::EnumToStringRemoveTopK(sample_enum);
108
109 INFO("変換された文字列は次の通りです." << actual);
110
111 CHECK(actual == expect);
112 }
113 }
114
115 TEST_CASE("先頭にkがついてない列挙体の要素を渡した時,そのままの要素名が返るべき")
116 {
117 SUBCASE("「three」を渡した時,そのままの要素名が返るべき")
118 {
119 const SampleEnum sample_enum = SampleEnum::three;
120 const std::string expect = "three";
121 const std::string actual = designlab::string_util::EnumToStringRemoveTopK(sample_enum);
122
123 INFO("変換された文字列は次の通りです." << actual);
124
125 CHECK(actual == expect);
126 }
127
128 SUBCASE("「FOUR」を渡した時,そのままの要素名が返るべき")
129 {
130 const SampleEnum sample_enum = SampleEnum::FOUR;
131 const std::string expect = "FOUR";
132 const std::string actual = designlab::string_util::EnumToStringRemoveTopK(sample_enum);
133
134 INFO("変換された文字列は次の通りです." << actual);
135
136 CHECK(actual == expect);
137 }
138
139 SUBCASE("「Five」を渡した時,そのままの要素名が返るべき")
140 {
141 const SampleEnum sample_enum = SampleEnum::Five;
142 const std::string expect = "Five";
143 const std::string actual = designlab::string_util::EnumToStringRemoveTopK(sample_enum);
144
145 INFO("変換された文字列は次の通りです." << actual);
146
147 CHECK(actual == expect);
148 }
149 }
150}
151
152TEST_SUITE("string_util::EnumValuesToString")
153{
154 enum class SampleEnum : int
155 {
156 kApple,
157 kBanana,
158 kTomato,
159 };
160
161 TEST_CASE("区切り文字をカンマにした時,文字列「kApple,kBanana,kTomato」が返るべき")
162 {
163 const std::string expect = "kApple,kBanana,kTomato";
164 const std::string sep = ",";
165 const std::string actual = designlab::string_util::EnumValuesToString<SampleEnum>(sep);
166
167 INFO("変換された文字列は次の通りです." << actual);
168
169 CHECK(actual == expect);
170 }
171}
172
173TEST_SUITE("string_util::EnumEntriesToString")
174{
175 enum class SampleEnum : int
176 {
177 kApple = 0,
178 kBanana = 1,
179 kTomato = 5,
180 };
181
182 TEST_CASE("区切り文字をカンマにした時,文字列「kApple = 0,kBanana = 1,kTomato = 5」が返るべき")
183 {
184 const std::string expect = "kApple = 0,kBanana = 1,kTomato = 5";
185 const std::string sep = ",";
186 const std::string actual = designlab::string_util::EnumEntriesToString<SampleEnum>(sep);
187
188 INFO("変換された文字列は次の通りです." << actual);
189
190 CHECK(actual == expect);
191 }
192}
193
194#endif // DESIGNLAB_STRING_UTIL_TEST_H_
std::vector< std::string > Split(const std::string &str, const std::string &separator)
文字列を分割する関数.指定した文字で文字列を分割する. 分割した結果,空白が含まれる場合や文字列がない場合は,そのまま返す. 最後が区切り文字で終わる場合は,それを無視する.
std::string EnumToStringRemoveTopK(const T &enum_value)
enumを文字列に変換する関数. Google C++ coding style だと enumの要素は 先頭にkをつけてキャメルケースで書くことが推奨されている. 例えば,
Definition string_util.h:54
std::string EnumValuesToString(const std::string separator)
enum型を渡すと,その要素を列挙した文字列を返す関数.
Definition string_util.h:75
TEST_SUITE("string_util::Split")