blob: dad4d72b0bffd408a56058fbf85daa21969ea7ec [file] [log] [blame]
// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "./grammar_codegen/code_generation.h"
#include <algorithm>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <string>
#include <string_view>
#include <vector>
#include "gtest/gtest.h"
#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_join.h"
#include "absl/strings/str_replace.h"
#include "absl/strings/str_split.h"
namespace {
std::string GetContents(const std::string& path) {
std::stringstream ss;
ss << std::ifstream(path).rdbuf();
return ss.str();
}
std::string RemoveWhiteSpace(std::string_view s) {
return absl::StrReplaceAll(s, {{" ", ""}, {"\n", ""}});
}
// Removes lines that start with "//" from `s`.
std::string RemoveCommentLines(std::string_view s) {
std::vector<std::string> lines = absl::StrSplit(s, '\n');
lines.erase(std::remove_if(lines.begin(), lines.end(),
[](std::string_view line) {
return absl::StartsWith(line, "//");
}),
lines.end());
return absl::StrJoin(lines, "\n");
}
TEST(RemoveCommentLines, RemovesLinesStartingWithDoubleSlash) {
EXPECT_EQ(RemoveCommentLines(R"(// comment 1
not a comment
// comment 2
not a comment again)"),
R"(not a comment
not a comment again)");
}
TEST(CodeGeneration, GenerateValidJsonGrammarHeader) {
const std::string src_dir = absl::StrCat(
getenv("TEST_SRCDIR"), "/com_google_fuzztest/");
const std::vector<std::string> input_files{
GetContents(absl::StrCat(src_dir, "fuzztest/grammars/JSON.g4"))};
const std::string generated_header =
fuzztest::internal::grammar::GenerateGrammarHeader(input_files);
const std::string ground_true_header = GetContents(absl::StrCat(
src_dir, "grammar_codegen/testdata/expected_json_grammar.h"));
// Check their contents are the same.
EXPECT_EQ(RemoveWhiteSpace(RemoveCommentLines(generated_header)),
RemoveWhiteSpace(RemoveCommentLines(ground_true_header)));
}
} // namespace