Coverage Report

Created: 2025-12-30 08:42

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
11.1k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
11.1k
  std::string out(tmpl);
33
11.1k
  std::string args[] = { std::string(vals)... };
34
35.0k
  for (size_t i = 0; i < std::size(args); ++i) {
35
23.9k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
23.9k
  }
38
11.1k
  return out;
39
11.1k
}
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.80k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
1.80k
  std::string out(tmpl);
33
1.80k
  std::string args[] = { std::string(vals)... };
34
3.60k
  for (size_t i = 0; i < std::size(args); ++i) {
35
1.80k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
1.80k
  }
38
1.80k
  return out;
39
1.80k
}
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
7.64k
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
7.64k
  std::string out(tmpl);
33
7.64k
  std::string args[] = { std::string(vals)... };
34
22.9k
  for (size_t i = 0; i < std::size(args); ++i) {
35
15.2k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
15.2k
  }
38
7.64k
  return out;
39
7.64k
}
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
816
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
816
  std::string out(tmpl);
33
816
  std::string args[] = { std::string(vals)... };
34
4.08k
  for (size_t i = 0; i < std::size(args); ++i) {
35
3.26k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
3.26k
  }
38
816
  return out;
39
816
}
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
358
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
358
  std::string out(tmpl);
33
358
  std::string args[] = { std::string(vals)... };
34
1.43k
  for (size_t i = 0; i < std::size(args); ++i) {
35
1.07k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
1.07k
  }
38
358
  return out;
39
358
}
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
503
std::string FormatJs(std::string_view tmpl, const StrLike&... vals) {
32
503
  std::string out(tmpl);
33
503
  std::string args[] = { std::string(vals)... };
34
3.01k
  for (size_t i = 0; i < std::size(args); ++i) {
35
2.51k
    std::string needle = "{" + std::to_string(i) + ")";
36
    // ^ fixing a small typo? Wait, keep original needle formation below.
37
2.51k
  }
38
503
  return out;
39
503
}
40
41
// Escape a *single-quoted* JS string literal (returns with quotes included).
42
17.0k
inline std::string ToSingleQuotedJsLiteral(std::string_view s) {
43
17.0k
  std::string out;
44
17.0k
  out.reserve(s.size() + 2);
45
17.0k
  out.push_back('\'');
46
584M
  for (unsigned char c : s) {
47
584M
    switch (c) {
48
3.97M
      case '\\': out += "\\\\"; break;
49
3.38M
      case '\'': out += "\\\'"; break;
50
15.6M
      case '\n': out += "\\n"; break;
51
6.01M
      case '\r': out += "\\r"; break;
52
5.31M
      case '\t': out += "\\t"; break;
53
3.46M
      case '\f': out += "\\f"; break;
54
1.51M
      case '\b': out += "\\b"; break;
55
545M
      default:
56
545M
        if (c < 0x20) {
57
400M
          char buf[5];
58
400M
          snprintf(buf, sizeof(buf), "\\x%02X", static_cast<int>(c));
59
400M
          out += buf;
60
400M
        } else {
61
144M
          out.push_back(static_cast<char>(c));
62
144M
        }
63
584M
    }
64
584M
  }
65
17.0k
  out.push_back('\'');
66
17.0k
  return out;
67
17.0k
}