blob: 675350d4a0851808d91aaa632b037569977111a3 [file] [log] [blame] [edit]
// Copyright 2025 The Pigweed Authors
//
// 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
//
// https://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 <array>
#include "pw_assert/check.h"
#include "pw_bytes/array.h"
#include "pw_perf_test/perf_test.h"
#include "pw_span/span.h"
#include "pw_tokenizer/detokenize.h"
namespace pw::tokenizer {
namespace {
constexpr char kDataWithArguments[] =
"TOKENS\0\0"
"\x09\x00\x00\x00"
"\0\0\0\0"
"\x00\x00\x00\x00----"
"\x0A\x0B\x0C\x0D----"
"\x0E\x0F\x00\x01----"
"\xAA\xAA\xAA\xAA----"
"\xBB\xBB\xBB\xBB----"
"\xCC\xCC\xCC\xCC----"
"\xDD\xDD\xDD\xDD----"
"\xEE\xEE\xEE\xEE----"
"\xFF\xFF\xFF\xFF----"
"\0"
"Use the %s, %s.\0"
"Now there are %d of %s!\0"
"%c!\0" // AA
"%hhu!\0" // BB
"%hu!\0" // CC
"%u!\0" // DD
"%lu!\0" // EE
"%llu!"; // FF
constexpr TokenDatabase kDatabase = TokenDatabase::Create<kDataWithArguments>();
void Detokenize(perf_test::State& state,
span<const std::byte> data,
std::string_view expected) {
Detokenizer detokenizer(kDatabase);
std::string result = detokenizer.Detokenize(data).BestString();
while (state.KeepRunning()) {
result = detokenizer.Detokenize(data).BestString();
}
PW_CHECK(result == expected);
}
PW_PERF_TEST(Detokenize_NoMessage,
Detokenize,
bytes::Array<1, 2, 3, 4, 5, 6>(),
"");
PW_PERF_TEST(Detokenize_NoArgs, Detokenize, bytes::Array<0, 0, 0, 0>(), "");
PW_PERF_TEST(Detokenize_OneArg,
Detokenize,
bytes::String("\xAA\xAA\xAA\xAA\xfc\x01"),
"~!");
PW_PERF_TEST(Detokenize_TwoArgs1,
Detokenize,
bytes::String("\x0E\x0F\x00\x01\x04\x04them"),
"Now there are 2 of them!");
PW_PERF_TEST(Detokenize_TwoArgs2,
Detokenize,
bytes::String("\x0E\x0F\x00\x01\x80\x01\x04them"),
"Now there are 64 of them!");
void DetokenizeText(perf_test::State& state,
std::string_view text,
std::string_view expected) {
Detokenizer detokenizer(kDatabase);
std::string result = detokenizer.DetokenizeText(text);
while (state.KeepRunning()) {
result = detokenizer.DetokenizeText(text);
}
PW_CHECK(result == expected);
}
PW_PERF_TEST(DetokenizeText_NoMessage,
DetokenizeText,
"Nothing!!",
"Nothing!!");
PW_PERF_TEST(DetokenizeText_NoArgs, DetokenizeText, "$AAAAAA==", "");
PW_PERF_TEST(DetokenizeText_OneArg, DetokenizeText, "$qqqqqvwB", "~!");
PW_PERF_TEST(DetokenizeText_TwoArgs1,
DetokenizeText,
"$Dg8AAQQEdGhlbQ==",
"Now there are 2 of them!");
PW_PERF_TEST(DetokenizeText_TwoArgs2,
DetokenizeText,
"$Dg8AAYABBHRoZW0=",
"Now there are 64 of them!");
PW_PERF_TEST(DetokenizeText_TwoMessages,
DetokenizeText,
"What the $qqqqqvwB, $Dg8AAQQEdGhlbQ==",
"What the ~!, Now there are 2 of them!");
} // namespace
} // namespace pw::tokenizer