blob: 4679d55fb7ecf57f54b6b49fdfa4322382301c09 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/fit/function.h>
#include <fidl/utils.h>
#include "examples.h"
#include "unittest_helpers.h"
namespace fidl {
namespace utils {
namespace {
void compare_id_to_words(std::string id, std::string expected_lowercase_words) {
std::ostringstream actual;
for (auto word : id_to_words(id)) {
if (actual.tellp() > 0) {
actual << " ";
}
actual << word;
}
ASSERT_STRING_EQ(expected_lowercase_words, actual.str(), "%s",
std::string("Failed for " + id).c_str());
}
TEST(UtilsTests, IdToWords) {
compare_id_to_words("agent_request_count", "agent request count");
compare_id_to_words("common", "common");
compare_id_to_words("Service", "service");
compare_id_to_words("Blink32", "blink32");
compare_id_to_words("the21jumpStreet", "the21jump street");
compare_id_to_words("the21JumpStreet", "the21 jump street");
compare_id_to_words("onOntologyUpdate", "on ontology update");
compare_id_to_words("urlLoader", "url loader");
compare_id_to_words("onUrlLoader", "on url loader");
compare_id_to_words("OnOntologyUpdate", "on ontology update");
compare_id_to_words("UrlLoader", "url loader");
compare_id_to_words("OnUrlLoader", "on url loader");
compare_id_to_words("kUrlLoader", "url loader");
compare_id_to_words("kOnUrlLoader", "on url loader");
compare_id_to_words("WhatIfSomeoneDoes_This", "what if someone does this");
compare_id_to_words("SOME_CONST", "some const");
compare_id_to_words("NAME_MIN_LEN", "name min len");
compare_id_to_words("OnPress", "on press");
compare_id_to_words("URLLoader", "url loader");
compare_id_to_words("PPPOE", "pppoe");
compare_id_to_words("PPP_O_E", "ppp o e");
compare_id_to_words("PPP_o_E", "ppp o e");
// Note the next two tests have expected results that may seem
// counter-intuitive, but if IDs like "URLLoader" are expected to
// translate to the words "url loader", then these translations
// are consistent.
compare_id_to_words("PppOE", "ppp oe");
compare_id_to_words("PPPoE", "pp po e");
}
void case_test(bool valid_conversion, std::string case_name,
fit::function<bool(std::string)> is_case,
fit::function<std::string(std::string)> to_case, std::string original,
std::string expected) {
EXPECT_FALSE(is_case(original), "%s", (original + " is " + case_name).c_str());
std::string converted = to_case(original);
EXPECT_STRING_EQ(
converted, expected, "%s",
("from '" + original + "' to '" + converted + "' != '" + expected + "'").c_str());
if (valid_conversion) {
EXPECT_TRUE(
is_case(expected), "%s",
("from '" + original + "' expected '" + expected + "' is not " + case_name).c_str());
EXPECT_TRUE(is_case(converted), "%s",
("from '" + original + "' to '" + converted + "' is not " + case_name).c_str());
} else {
EXPECT_FALSE(is_case(converted), "%s",
("from '" + original + "' to '" + converted + "' was not expected to match " +
case_name + ", but did!")
.c_str());
}
}
#define ASSERT_CASE(CASE, FROM, TO) \
case_test(/*valid_conversion=*/true, #CASE, is_##CASE##_case, to_##CASE##_case, FROM, TO)
#define ASSERT_BAD_CASE(CASE, FROM, TO) \
case_test(/*valid_conversion=*/false, #CASE, is_##CASE##_case, to_##CASE##_case, FROM, TO)
TEST(UtilsTests, UpperCamelCase) {
ASSERT_CASE(upper_camel, "x", "X");
ASSERT_CASE(upper_camel, "xy", "Xy");
ASSERT_BAD_CASE(upper_camel, "x_y", "XY");
ASSERT_CASE(upper_camel, "xyz_123", "Xyz123");
ASSERT_CASE(upper_camel, "xy_z_123", "XyZ123");
ASSERT_CASE(upper_camel, "xy_z123", "XyZ123");
ASSERT_CASE(upper_camel, "days_in_a_week", "DaysInAWeek");
ASSERT_CASE(upper_camel, "android8_0_0", "Android8_0_0");
ASSERT_CASE(upper_camel, "android_8_0_0", "Android8_0_0");
ASSERT_CASE(upper_camel, "x_marks_the_spot", "XMarksTheSpot");
ASSERT_CASE(upper_camel, "RealID", "RealId");
ASSERT_CASE(upper_camel, "real_id", "RealId");
ASSERT_BAD_CASE(upper_camel, "real_i_d", "RealID");
ASSERT_CASE(upper_camel, "real3d", "Real3d");
ASSERT_CASE(upper_camel, "real3_d", "Real3D");
ASSERT_CASE(upper_camel, "real_3d", "Real3d");
ASSERT_CASE(upper_camel, "real_3_d", "Real3D");
ASSERT_CASE(upper_camel, "sample_x_union", "SampleXUnion");
ASSERT_CASE(upper_camel, "sample_xunion", "SampleXunion");
ASSERT_CASE(upper_camel, "URLLoader", "UrlLoader");
ASSERT_CASE(upper_camel, "is_21Jump_street", "Is21JumpStreet");
ASSERT_CASE(upper_camel, "URLloader", "UrLloader");
ASSERT_CASE(upper_camel, "URLLoader", "UrlLoader");
ASSERT_CASE(upper_camel, "url_loader", "UrlLoader");
ASSERT_CASE(upper_camel, "URL_LOADER", "UrlLoader");
ASSERT_CASE(upper_camel, "urlLoader", "UrlLoader");
ASSERT_CASE(upper_camel, "kUrlLoader", "UrlLoader");
ASSERT_CASE(upper_camel, "kURLLoader", "UrlLoader");
}
TEST(UtilsTests, LowerCamelCase) {
ASSERT_CASE(lower_camel, "X", "x");
ASSERT_CASE(lower_camel, "XY", "xy");
ASSERT_CASE(lower_camel, "X_Y", "xY");
ASSERT_CASE(lower_camel, "XYZ_123", "xyz123");
ASSERT_CASE(lower_camel, "XY_Z_123", "xyZ123");
ASSERT_CASE(lower_camel, "XY_Z123", "xyZ123");
ASSERT_CASE(lower_camel, "DAYS_IN_A_WEEK", "daysInAWeek");
ASSERT_CASE(lower_camel, "ANDROID8_0_0", "android8_0_0");
ASSERT_CASE(lower_camel, "ANDROID_8_0_0", "android8_0_0");
ASSERT_CASE(lower_camel, "X_MARKS_THE_SPOT", "xMarksTheSpot");
ASSERT_CASE(lower_camel, "realID", "realId");
ASSERT_CASE(lower_camel, "REAL_ID", "realId");
ASSERT_BAD_CASE(lower_camel, "REAL_I_D", "realID");
ASSERT_CASE(lower_camel, "REAL3D", "real3D");
ASSERT_CASE(lower_camel, "REAL3_D", "real3D");
ASSERT_CASE(lower_camel, "REAL_3D", "real3D");
ASSERT_CASE(lower_camel, "REAL_3_D", "real3D");
ASSERT_CASE(lower_camel, "SAMPLE_X_UNION", "sampleXUnion");
ASSERT_CASE(lower_camel, "SAMPLE_XUNION", "sampleXunion");
ASSERT_CASE(lower_camel, "URLLoader", "urlLoader");
ASSERT_CASE(lower_camel, "is_21Jump_street", "is21JumpStreet");
ASSERT_CASE(lower_camel, "URLloader", "urLloader");
ASSERT_CASE(lower_camel, "UrlLoader", "urlLoader");
ASSERT_CASE(lower_camel, "URLLoader", "urlLoader");
ASSERT_CASE(lower_camel, "url_loader", "urlLoader");
ASSERT_CASE(lower_camel, "URL_LOADER", "urlLoader");
ASSERT_CASE(lower_camel, "kUrlLoader", "urlLoader");
ASSERT_CASE(lower_camel, "kURLLoader", "urlLoader");
}
TEST(UtilsTests, UpperSnakeCase) {
ASSERT_CASE(upper_snake, "x", "X");
ASSERT_CASE(upper_snake, "xy", "XY");
ASSERT_CASE(upper_snake, "xY", "X_Y");
ASSERT_CASE(upper_snake, "xyz123", "XYZ123");
ASSERT_CASE(upper_snake, "xyz_123", "XYZ_123");
ASSERT_CASE(upper_snake, "xyZ123", "XY_Z123");
ASSERT_CASE(upper_snake, "daysInAWeek", "DAYS_IN_A_WEEK");
ASSERT_CASE(upper_snake, "android8_0_0", "ANDROID8_0_0");
ASSERT_CASE(upper_snake, "android_8_0_0", "ANDROID_8_0_0");
ASSERT_CASE(upper_snake, "xMarksTheSpot", "X_MARKS_THE_SPOT");
ASSERT_CASE(upper_snake, "realId", "REAL_ID");
ASSERT_CASE(upper_snake, "realID", "REAL_ID");
ASSERT_CASE(upper_snake, "real3d", "REAL3D");
ASSERT_CASE(upper_snake, "real3D", "REAL3_D");
ASSERT_CASE(upper_snake, "real_3d", "REAL_3D");
ASSERT_CASE(upper_snake, "real_3D", "REAL_3_D");
ASSERT_CASE(upper_snake, "sampleXUnion", "SAMPLE_X_UNION");
ASSERT_CASE(upper_snake, "sampleXunion", "SAMPLE_XUNION");
ASSERT_CASE(upper_snake, "URLLoader", "URL_LOADER");
ASSERT_CASE(upper_snake, "is_21Jump_street", "IS_21_JUMP_STREET");
ASSERT_CASE(upper_snake, "URLloader", "UR_LLOADER");
ASSERT_CASE(upper_snake, "UrlLoader", "URL_LOADER");
ASSERT_CASE(upper_snake, "URLLoader", "URL_LOADER");
ASSERT_CASE(upper_snake, "url_loader", "URL_LOADER");
ASSERT_CASE(upper_snake, "urlLoader", "URL_LOADER");
ASSERT_CASE(upper_snake, "kUrlLoader", "URL_LOADER");
ASSERT_CASE(upper_snake, "kURLLoader", "URL_LOADER");
}
TEST(UtilsTests, LowerSnakeCase) {
ASSERT_CASE(lower_snake, "X", "x");
ASSERT_CASE(lower_snake, "Xy", "xy");
ASSERT_CASE(lower_snake, "XY", "xy");
ASSERT_CASE(lower_snake, "Xyz123", "xyz123");
ASSERT_CASE(lower_snake, "Xyz_123", "xyz_123");
ASSERT_CASE(lower_snake, "XyZ123", "xy_z123");
ASSERT_CASE(lower_snake, "DaysInAWeek", "days_in_a_week");
ASSERT_CASE(lower_snake, "Android8_0_0", "android8_0_0");
ASSERT_CASE(lower_snake, "Android_8_0_0", "android_8_0_0");
ASSERT_CASE(lower_snake, "XMarksTheSpot", "x_marks_the_spot");
ASSERT_CASE(lower_snake, "RealId", "real_id");
ASSERT_CASE(lower_snake, "RealID", "real_id");
ASSERT_CASE(lower_snake, "Real3d", "real3d");
ASSERT_CASE(lower_snake, "Real3D", "real3_d");
ASSERT_CASE(lower_snake, "Real_3d", "real_3d");
ASSERT_CASE(lower_snake, "Real_3D", "real_3_d");
ASSERT_CASE(lower_snake, "SampleXUnion", "sample_x_union");
ASSERT_CASE(lower_snake, "SampleXunion", "sample_xunion");
ASSERT_CASE(lower_snake, "URLLoader", "url_loader");
ASSERT_CASE(lower_snake, "is_21Jump_street", "is_21_jump_street");
ASSERT_CASE(lower_snake, "URLloader", "ur_lloader");
ASSERT_CASE(lower_snake, "UrlLoader", "url_loader");
ASSERT_CASE(lower_snake, "URLLoader", "url_loader");
ASSERT_CASE(lower_snake, "URL_LOADER", "url_loader");
ASSERT_CASE(lower_snake, "urlLoader", "url_loader");
ASSERT_CASE(lower_snake, "kUrlLoader", "url_loader");
ASSERT_CASE(lower_snake, "kURLLoader", "url_loader");
}
TEST(UtilsTests, KonstantCase) {
ASSERT_CASE(konstant, "URLLoader", "kUrlLoader");
ASSERT_CASE(konstant, "is_21Jump_street", "kIs21JumpStreet");
ASSERT_CASE(konstant, "URLloader", "kUrLloader");
ASSERT_CASE(konstant, "UrlLoader", "kUrlLoader");
ASSERT_CASE(konstant, "URLLoader", "kUrlLoader");
ASSERT_CASE(konstant, "url_loader", "kUrlLoader");
ASSERT_CASE(konstant, "URL_LOADER", "kUrlLoader");
ASSERT_CASE(konstant, "urlLoader", "kUrlLoader");
ASSERT_CASE(konstant, "kURLLoader", "kUrlLoader");
}
TEST(UtilsTests, LowerNoSeparatorCase) {
ASSERT_CASE(lower_no_separator, "URLLoader", "urlloader");
ASSERT_CASE(lower_no_separator, "is_21Jump_street", "is21jumpstreet");
ASSERT_CASE(lower_no_separator, "URLloader", "urlloader");
ASSERT_CASE(lower_no_separator, "UrlLoader", "urlloader");
ASSERT_CASE(lower_no_separator, "URLLoader", "urlloader");
ASSERT_CASE(lower_no_separator, "url_loader", "urlloader");
ASSERT_CASE(lower_no_separator, "URL_LOADER", "urlloader");
ASSERT_CASE(lower_no_separator, "urlLoader", "urlloader");
ASSERT_CASE(lower_no_separator, "kUrlLoader", "urlloader");
ASSERT_CASE(lower_no_separator, "kURLLoader", "urlloader");
}
TEST(UtilsTests, WhitespaceAndComments) {
ASSERT_TRUE(IsWhitespace(' '));
ASSERT_TRUE(IsWhitespace('\t'));
ASSERT_TRUE(IsWhitespace('\v'));
ASSERT_TRUE(IsWhitespace('\f'));
ASSERT_TRUE(IsWhitespace('\r'));
ASSERT_TRUE(IsWhitespace('\n'));
ASSERT_FALSE(IsWhitespace('\0'));
ASSERT_FALSE(IsWhitespace('_'));
ASSERT_FALSE(IsWhitespace('-'));
ASSERT_FALSE(IsWhitespace('A'));
ASSERT_FALSE(IsWhitespace('Z'));
ASSERT_FALSE(IsWhitespace('a'));
ASSERT_FALSE(IsWhitespace('z'));
ASSERT_FALSE(IsWhitespace('0'));
ASSERT_FALSE(IsWhitespace('9'));
ASSERT_FALSE(IsWhitespace('!'));
ASSERT_TRUE(IsWhitespaceNoNewline(' '));
ASSERT_TRUE(IsWhitespaceNoNewline('\t'));
ASSERT_TRUE(IsWhitespaceNoNewline('\v'));
ASSERT_TRUE(IsWhitespaceNoNewline('\f'));
ASSERT_TRUE(IsWhitespaceNoNewline('\r'));
ASSERT_FALSE(IsWhitespaceNoNewline('\n'));
ASSERT_FALSE(IsWhitespaceNoNewline('\0'));
ASSERT_FALSE(IsWhitespaceNoNewline('_'));
ASSERT_FALSE(IsWhitespaceNoNewline('-'));
ASSERT_FALSE(IsWhitespaceNoNewline('A'));
ASSERT_FALSE(IsWhitespaceNoNewline('Z'));
ASSERT_FALSE(IsWhitespaceNoNewline('a'));
ASSERT_FALSE(IsWhitespaceNoNewline('z'));
ASSERT_FALSE(IsWhitespaceNoNewline('0'));
ASSERT_FALSE(IsWhitespaceNoNewline('9'));
ASSERT_FALSE(IsWhitespaceNoNewline('!'));
ASSERT_TRUE(IsBlank(""));
ASSERT_TRUE(IsBlank(" "));
ASSERT_TRUE(IsBlank("\t"));
ASSERT_TRUE(IsBlank("\n"));
ASSERT_TRUE(IsBlank("\n\n\n"));
ASSERT_TRUE(IsBlank(" \n \n \n"));
ASSERT_TRUE(IsBlank(" \t\v\f\r\n"));
ASSERT_TRUE(IsBlank(" "));
ASSERT_TRUE(IsBlank(" \t \t "));
ASSERT_TRUE(IsBlank("\t \t \t"));
ASSERT_FALSE(IsBlank("multi\nline"));
ASSERT_FALSE(IsBlank("\nmore\nmulti\nline\n"));
ASSERT_FALSE(IsBlank("\t\t."));
ASSERT_FALSE(IsBlank(" ."));
ASSERT_FALSE(IsBlank(". "));
ASSERT_FALSE(IsBlank("// Comment "));
ASSERT_FALSE(IsBlank("/// Doc Comment "));
ASSERT_TRUE(LineFromOffsetIsBlank("four", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four\n", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four ", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four \n", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four \t \t ", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four \n", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four \t\n", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four \n\t", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four \nmore lines", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four \nmore lines\n", 4));
ASSERT_TRUE(LineFromOffsetIsBlank("four \t\n\t", 4));
ASSERT_FALSE(LineFromOffsetIsBlank("four.", 4));
ASSERT_FALSE(LineFromOffsetIsBlank("four.\n", 4));
ASSERT_FALSE(LineFromOffsetIsBlank("fournot blank \n", 4));
ASSERT_FALSE(LineFromOffsetIsBlank("four more chars", 4));
ASSERT_FALSE(LineFromOffsetIsBlank("four more chars\n", 4));
ASSERT_TRUE(FirstLineIsBlank(""));
ASSERT_TRUE(FirstLineIsBlank(""));
ASSERT_TRUE(FirstLineIsBlank("\n"));
ASSERT_TRUE(FirstLineIsBlank(" "));
ASSERT_TRUE(FirstLineIsBlank(" \n"));
ASSERT_TRUE(FirstLineIsBlank(" \t \t "));
ASSERT_TRUE(FirstLineIsBlank(" \n"));
ASSERT_TRUE(FirstLineIsBlank(" \t\n"));
ASSERT_TRUE(FirstLineIsBlank(" \nmore lines"));
ASSERT_TRUE(FirstLineIsBlank(" \nmore lines\n"));
ASSERT_TRUE(FirstLineIsBlank(" \n\t"));
ASSERT_TRUE(FirstLineIsBlank(" \t\n\t"));
ASSERT_FALSE(FirstLineIsBlank("."));
ASSERT_FALSE(FirstLineIsBlank(".\n"));
ASSERT_FALSE(FirstLineIsBlank("not blank \n"));
ASSERT_FALSE(FirstLineIsBlank(" more chars"));
ASSERT_FALSE(FirstLineIsBlank(" more chars\n"));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// ", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// \n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// \t\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//not blank ", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// not blank", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//not blank", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//not blank \n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// not blank\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//not blank\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// \n\t", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// \t\n\t", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// \nmore lines", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four// \nmore lines\n", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four.//", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four .//\n", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("fourmore// ", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four more\n// \n", 4));
//// Greater than 3 slashes are still interpreted as a regular comment
ASSERT_TRUE(LineFromOffsetIsRegularComment("four////", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four////\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//// ", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//// \n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//// \t\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four////not blank ", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//// not blank", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four////not blank", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four////not blank \n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four//// not blank\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four////not blank\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four/////", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four/////\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four///// ", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four///// \n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four///// \t\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four/////not blank ", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four///// not blank", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four/////not blank", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four/////not blank \n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four///// not blank\n", 4));
ASSERT_TRUE(LineFromOffsetIsRegularComment("four/////not blank\n", 4));
/// FIDL Doc Comments start with 3 slashes, like this one
ASSERT_FALSE(LineFromOffsetIsRegularComment("four///", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four///\n", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four/// ", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four/// \n", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four/// \t\n", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four///not blank ", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four/// not blank", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four///not blank", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four///not blank \n", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four/// not blank\n", 4));
ASSERT_FALSE(LineFromOffsetIsRegularComment("four///not blank\n", 4));
ASSERT_TRUE(FirstLineIsRegularComment("//"));
ASSERT_TRUE(FirstLineIsRegularComment("//\n"));
ASSERT_TRUE(FirstLineIsRegularComment("// "));
ASSERT_TRUE(FirstLineIsRegularComment("// \n"));
ASSERT_TRUE(FirstLineIsRegularComment("// \t\n"));
ASSERT_TRUE(FirstLineIsRegularComment("//not blank "));
ASSERT_TRUE(FirstLineIsRegularComment("// not blank"));
ASSERT_TRUE(FirstLineIsRegularComment("//not blank"));
ASSERT_TRUE(FirstLineIsRegularComment("//not blank \n"));
ASSERT_TRUE(FirstLineIsRegularComment("// not blank\n"));
ASSERT_TRUE(FirstLineIsRegularComment("//not blank\n"));
ASSERT_TRUE(FirstLineIsRegularComment("// \n\t"));
ASSERT_TRUE(FirstLineIsRegularComment("// \t\n\t"));
ASSERT_TRUE(FirstLineIsRegularComment("// \nmore lines"));
ASSERT_TRUE(FirstLineIsRegularComment("// \nmore lines\n"));
ASSERT_FALSE(FirstLineIsRegularComment(".//"));
ASSERT_FALSE(FirstLineIsRegularComment(" .//\n"));
ASSERT_FALSE(FirstLineIsRegularComment("more// "));
ASSERT_FALSE(FirstLineIsRegularComment(" more\n// \n"));
//// Greater than 3 slashes are still interpreted as a regular comment
ASSERT_TRUE(FirstLineIsRegularComment("////"));
ASSERT_TRUE(FirstLineIsRegularComment("////\n"));
ASSERT_TRUE(FirstLineIsRegularComment("//// "));
ASSERT_TRUE(FirstLineIsRegularComment("//// \n"));
ASSERT_TRUE(FirstLineIsRegularComment("//// \t\n"));
ASSERT_TRUE(FirstLineIsRegularComment("////not blank "));
ASSERT_TRUE(FirstLineIsRegularComment("//// not blank"));
ASSERT_TRUE(FirstLineIsRegularComment("////not blank"));
ASSERT_TRUE(FirstLineIsRegularComment("////not blank \n"));
ASSERT_TRUE(FirstLineIsRegularComment("//// not blank\n"));
ASSERT_TRUE(FirstLineIsRegularComment("////not blank\n"));
ASSERT_TRUE(FirstLineIsRegularComment("/////"));
ASSERT_TRUE(FirstLineIsRegularComment("/////\n"));
ASSERT_TRUE(FirstLineIsRegularComment("///// "));
ASSERT_TRUE(FirstLineIsRegularComment("///// \n"));
ASSERT_TRUE(FirstLineIsRegularComment("///// \t\n"));
ASSERT_TRUE(FirstLineIsRegularComment("/////not blank "));
ASSERT_TRUE(FirstLineIsRegularComment("///// not blank"));
ASSERT_TRUE(FirstLineIsRegularComment("/////not blank"));
ASSERT_TRUE(FirstLineIsRegularComment("/////not blank \n"));
ASSERT_TRUE(FirstLineIsRegularComment("///// not blank\n"));
ASSERT_TRUE(FirstLineIsRegularComment("/////not blank\n"));
/// FIDL Doc Comments start with 3 slashes, like this one
ASSERT_FALSE(FirstLineIsRegularComment("///"));
ASSERT_FALSE(FirstLineIsRegularComment("///\n"));
ASSERT_FALSE(FirstLineIsRegularComment("/// "));
ASSERT_FALSE(FirstLineIsRegularComment("/// \n"));
ASSERT_FALSE(FirstLineIsRegularComment("/// \t\n"));
ASSERT_FALSE(FirstLineIsRegularComment("///not blank "));
ASSERT_FALSE(FirstLineIsRegularComment("/// not blank"));
ASSERT_FALSE(FirstLineIsRegularComment("///not blank"));
ASSERT_FALSE(FirstLineIsRegularComment("///not blank \n"));
ASSERT_FALSE(FirstLineIsRegularComment("/// not blank\n"));
ASSERT_FALSE(FirstLineIsRegularComment("///not blank\n"));
}
TEST(UtilsTests, IsValidLibraryComponent) {
ASSERT_TRUE(IsValidLibraryComponent("a"));
ASSERT_TRUE(IsValidLibraryComponent("abc"));
ASSERT_TRUE(IsValidLibraryComponent("a2b"));
ASSERT_FALSE(IsValidLibraryComponent(""));
ASSERT_FALSE(IsValidLibraryComponent("A"));
ASSERT_FALSE(IsValidLibraryComponent("2"));
ASSERT_FALSE(IsValidLibraryComponent("a_c"));
ASSERT_FALSE(IsValidLibraryComponent("ab_"));
}
TEST(UtilsTests, IsValidIdentifierComponent) {
ASSERT_TRUE(IsValidIdentifierComponent("a"));
ASSERT_TRUE(IsValidIdentifierComponent("abc"));
ASSERT_TRUE(IsValidIdentifierComponent("A"));
ASSERT_TRUE(IsValidIdentifierComponent("a2b"));
ASSERT_TRUE(IsValidIdentifierComponent("a_c"));
ASSERT_FALSE(IsValidIdentifierComponent(""));
ASSERT_FALSE(IsValidIdentifierComponent("2"));
ASSERT_FALSE(IsValidIdentifierComponent("ab_"));
}
TEST(UtilsTests, IsValidFullyQualifiedMethodIdentifier) {
ASSERT_TRUE(IsValidFullyQualifiedMethodIdentifier("lib/Protocol.Method"));
ASSERT_TRUE(IsValidFullyQualifiedMethodIdentifier("long.lib/Protocol.Method"));
ASSERT_FALSE(IsValidFullyQualifiedMethodIdentifier("Method"));
ASSERT_FALSE(IsValidFullyQualifiedMethodIdentifier("lib/Protocol"));
ASSERT_FALSE(IsValidFullyQualifiedMethodIdentifier("lonG.lib/Protocol.Method"));
ASSERT_FALSE(IsValidFullyQualifiedMethodIdentifier("long.liB/Protocol.Method"));
}
TEST(UtilsTests, IsOnlyWhitespace) {
std::string good_output;
std::string bad_output;
for (auto element : Examples::map()) {
if (element.first.find("testdata/goodformat.test.fidl") != std::string::npos) {
good_output = Examples::map()[element.first];
} else if (element.first.find("testdata/badformat.fidl") != std::string::npos) {
bad_output = Examples::map()[element.first];
}
}
ASSERT_GT(good_output.size(), 0);
ASSERT_GT(bad_output.size(), 0);
ASSERT_TRUE(OnlyWhitespaceChanged(bad_output, good_output));
}
TEST(UtilsTests, CanonicalForm) {
EXPECT_STRING_EQ(canonicalize(""), "");
// Basic letter combinations.
EXPECT_STRING_EQ(canonicalize("a"), "a");
EXPECT_STRING_EQ(canonicalize("A"), "a");
EXPECT_STRING_EQ(canonicalize("ab"), "ab");
EXPECT_STRING_EQ(canonicalize("AB"), "ab");
EXPECT_STRING_EQ(canonicalize("Ab"), "ab");
EXPECT_STRING_EQ(canonicalize("aB"), "a_b");
EXPECT_STRING_EQ(canonicalize("a_b"), "a_b");
EXPECT_STRING_EQ(canonicalize("A_B"), "a_b");
EXPECT_STRING_EQ(canonicalize("A_b"), "a_b");
EXPECT_STRING_EQ(canonicalize("a_B"), "a_b");
// Digits are treated like lowercase letters.
EXPECT_STRING_EQ(canonicalize("1"), "1");
EXPECT_STRING_EQ(canonicalize("a1"), "a1");
EXPECT_STRING_EQ(canonicalize("A1"), "a1");
// Leading digits are illegal in FIDL identifiers, so these do not matter.
EXPECT_STRING_EQ(canonicalize("1a"), "1a");
EXPECT_STRING_EQ(canonicalize("1A"), "1_a");
EXPECT_STRING_EQ(canonicalize("12"), "12");
// Lower/upper snake/camel case conventions.
EXPECT_STRING_EQ(canonicalize("lowerCamelCase"), "lower_camel_case");
EXPECT_STRING_EQ(canonicalize("UpperCamelCase"), "upper_camel_case");
EXPECT_STRING_EQ(canonicalize("lower_snake_case"), "lower_snake_case");
EXPECT_STRING_EQ(canonicalize("UPPER_SNAKE_CASE"), "upper_snake_case");
EXPECT_STRING_EQ(canonicalize("Camel_With_Underscores"), "camel_with_underscores");
EXPECT_STRING_EQ(canonicalize("camelWithAOneLetterWord"), "camel_with_a_one_letter_word");
EXPECT_STRING_EQ(canonicalize("1_2__3___underscores"), "1_2_3_underscores");
// Acronym casing.
EXPECT_STRING_EQ(canonicalize("HTTPServer"), "http_server");
EXPECT_STRING_EQ(canonicalize("HttpServer"), "http_server");
EXPECT_STRING_EQ(canonicalize("URLIsATLA"), "url_is_atla");
EXPECT_STRING_EQ(canonicalize("UrlIsATla"), "url_is_a_tla");
// Words with digits: H264 encoder.
EXPECT_STRING_EQ(canonicalize("h264encoder"), "h264encoder");
EXPECT_STRING_EQ(canonicalize("H264ENCODER"), "h264_encoder");
EXPECT_STRING_EQ(canonicalize("h264_encoder"), "h264_encoder");
EXPECT_STRING_EQ(canonicalize("H264_ENCODER"), "h264_encoder");
EXPECT_STRING_EQ(canonicalize("h264Encoder"), "h264_encoder");
EXPECT_STRING_EQ(canonicalize("H264Encoder"), "h264_encoder");
// Words with digits: DDR4 memory.
EXPECT_STRING_EQ(canonicalize("ddr4memory"), "ddr4memory");
EXPECT_STRING_EQ(canonicalize("DDR4MEMORY"), "ddr4_memory");
EXPECT_STRING_EQ(canonicalize("ddr4_memory"), "ddr4_memory");
EXPECT_STRING_EQ(canonicalize("DDR4_MEMORY"), "ddr4_memory");
EXPECT_STRING_EQ(canonicalize("ddr4Memory"), "ddr4_memory");
EXPECT_STRING_EQ(canonicalize("Ddr4Memory"), "ddr4_memory");
EXPECT_STRING_EQ(canonicalize("DDR4Memory"), "ddr4_memory");
// Words with digits: A2DP profile.
EXPECT_STRING_EQ(canonicalize("a2dpprofile"), "a2dpprofile");
EXPECT_STRING_EQ(canonicalize("A2DPPROFILE"), "a2_dpprofile");
EXPECT_STRING_EQ(canonicalize("a2dp_profile"), "a2dp_profile");
EXPECT_STRING_EQ(canonicalize("A2DP_PROFILE"), "a2_dp_profile");
EXPECT_STRING_EQ(canonicalize("a2dpProfile"), "a2dp_profile");
EXPECT_STRING_EQ(canonicalize("A2dpProfile"), "a2dp_profile");
EXPECT_STRING_EQ(canonicalize("A2DPProfile"), "a2_dp_profile");
// Words with digits: R2D2 is one word.
EXPECT_STRING_EQ(canonicalize("r2d2isoneword"), "r2d2isoneword");
EXPECT_STRING_EQ(canonicalize("R2D2ISONEWORD"), "r2_d2_isoneword");
EXPECT_STRING_EQ(canonicalize("r2d2_is_one_word"), "r2d2_is_one_word");
EXPECT_STRING_EQ(canonicalize("R2D2_IS_ONE_WORD"), "r2_d2_is_one_word");
EXPECT_STRING_EQ(canonicalize("r2d2IsOneWord"), "r2d2_is_one_word");
EXPECT_STRING_EQ(canonicalize("R2d2IsOneWord"), "r2d2_is_one_word");
EXPECT_STRING_EQ(canonicalize("R2D2IsOneWord"), "r2_d2_is_one_word");
// Leading and trailing underscores are illegal in FIDL identifiers, so these
// do not matter.
EXPECT_STRING_EQ(canonicalize("_"), "");
EXPECT_STRING_EQ(canonicalize("_a"), "a");
EXPECT_STRING_EQ(canonicalize("a_"), "a_");
EXPECT_STRING_EQ(canonicalize("_a_"), "a_");
EXPECT_STRING_EQ(canonicalize("__a__"), "a_");
}
} // namespace
} // namespace utils
} // namespace fidl