Coverage Report

Created: 2025-10-31 09:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/node/test/fuzzers/fuzz_js_format.h
Line
Count
Source
1
// Copyright 2025 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//      http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#pragma once
16
#include <string>
17
#include <string_view>
18
19
// Minimal numbered placeholder formatter: replaces {0}, {1}, ... with strings.
20
// Dependency-free and perfect for short JS templates.
21
0
inline void ReplaceAll_(std::string& s, std::string_view from, std::string_view to) {
22
0
  if (from.empty()) return;
23
0
  size_t pos = 0;
24
0
  while ((pos = s.find(from, pos)) != std::string::npos) {
25
0
    s.replace(pos, from.size(), to);
26
0
    pos += to.size();
27
0
  }
28
0
}
29
30
template <typename... StrLike>
31
9.48k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
9.48k
  std::string out(tmpl);
33
9.48k
  std::string args[] = { std::string(vals)... };
34
29.9k
  for (size_t i = 0; i < std::size(args); ++i) {
35
20.4k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
20.4k
  }
38
9.48k
  return out;
39
9.48k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
1.53k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
1.53k
  std::string out(tmpl);
33
1.53k
  std::string args[] = { std::string(vals)... };
34
3.07k
  for (size_t i = 0; i < std::size(args); ++i) {
35
1.53k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
1.53k
  }
38
1.53k
  return out;
39
1.53k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
6.54k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
6.54k
  std::string out(tmpl);
33
6.54k
  std::string args[] = { std::string(vals)... };
34
19.6k
  for (size_t i = 0; i < std::size(args); ++i) {
35
13.0k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
13.0k
  }
38
6.54k
  return out;
39
6.54k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
703
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
703
  std::string out(tmpl);
33
703
  std::string args[] = { std::string(vals)... };
34
3.51k
  for (size_t i = 0; i < std::size(args); ++i) {
35
2.81k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
2.81k
  }
38
703
  return out;
39
703
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
279
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
279
  std::string out(tmpl);
33
279
  std::string args[] = { std::string(vals)... };
34
1.11k
  for (size_t i = 0; i < std::size(args); ++i) {
35
837
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
837
  }
38
279
  return out;
39
279
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > FormatJs<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
31
429
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
429
  std::string out(tmpl);
33
429
  std::string args[] = { std::string(vals)... };
34
2.57k
  for (size_t i = 0; i < std::size(args); ++i) {
35
2.14k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
2.14k
  }
38
429
  return out;
39
429
}
40
41
// Escape a *single-quoted* JS string literal (returns with quotes included).
42
14.5k
inline std::string ToSingleQuotedJsLiteral(std::string_view s) {
43
14.5k
  std::string out;
44
14.5k
  out.reserve(s.size() + 2);
45
14.5k
  out.push_back('\'');
46
574M
  for (unsigned char c : s) {
47
574M
    switch (c) {
48
3.07M
      case '\\': out += "\\\\"; break;
49
680k
      case '\'': out += "\\\'"; break;
50
21.6M
      case '\n': out += "\\n"; break;
51
13.0M
      case '\r': out += "\\r"; break;
52
2.66M
      case '\t': out += "\\t"; break;
53
720k
      case '\f': out += "\\f"; break;
54
887k
      case '\b': out += "\\b"; break;
55
532M
      default:
56
532M
        if (c < 0x20) {
57
404M
          char buf[5];
58
404M
          snprintf(buf, sizeof(buf), "\\x%02X", static_cast<int>(c));
59
404M
          out += buf;
60
404M
        } else {
61
127M
          out.push_back(static_cast<char>(c));
62
127M
        }
63
574M
    }
64
574M
  }
65
14.5k
  out.push_back('\'');
66
14.5k
  return out;
67
14.5k
}