Fix reporting invalid multi-value seeds Instead of "78, ", print "7, 8".
diff --git a/e2e_tests/functional_test.cc b/e2e_tests/functional_test.cc index 9ee676e..9f31953 100644 --- a/e2e_tests/functional_test.cc +++ b/e2e_tests/functional_test.cc
@@ -134,10 +134,12 @@ EXPECT_THAT(std_err, HasSubstr("Could not turn value into corpus type:\n{17}")); EXPECT_THAT(std_err, HasSubstr("The value 17 is not InRange(0, 10):\n{17}")); + EXPECT_THAT(std_err, + HasSubstr("The value 8 is not InRange(10, 20):\n{7, 8}")); // Valid seeds are not reported. EXPECT_THAT(std_err, Not(HasSubstr("{6}"))); // Tests should still run. - EXPECT_THAT(std_out, HasSubstr("[ PASSED ] 3 tests.")); + EXPECT_THAT(std_out, HasSubstr("[ PASSED ] 4 tests.")); EXPECT_THAT(status, ExitCode(0)); }
diff --git a/e2e_tests/testdata/fuzz_tests_with_invalid_seeds.cc b/e2e_tests/testdata/fuzz_tests_with_invalid_seeds.cc index 2596ea1..924a22a 100644 --- a/e2e_tests/testdata/fuzz_tests_with_invalid_seeds.cc +++ b/e2e_tests/testdata/fuzz_tests_with_invalid_seeds.cc
@@ -25,12 +25,17 @@ // Map does not support seeds. .WithDomains(fuzztest::Map([](int) { return 0; }, fuzztest::Arbitrary<int>())) - .WithSeeds({{17}}); + .WithSeeds({17}); void InvalidSeedDueToCorpusValueOutOfDomain(int) {} FUZZ_TEST(MySuite, InvalidSeedDueToCorpusValueOutOfDomain) .WithDomains(fuzztest::InRange(0, 10)) - .WithSeeds({{2}, {17}, {6}}); + .WithSeeds({2, 17, 6}); + +void InvalidMultiValueSeedDueToOneValueOutOfDomain(int, int) {} +FUZZ_TEST(MySuite, InvalidMultiValueSeedDueToOneValueOutOfDomain) + .WithDomains(fuzztest::InRange(0, 10), fuzztest::InRange(10, 20)) + .WithSeeds({{7, 8}}); struct MyTest { void ShouldNotCrash(int) {}
diff --git a/fuzztest/internal/registration.h b/fuzztest/internal/registration.h index 3c41864..0707fd4 100644 --- a/fuzztest/internal/registration.h +++ b/fuzztest/internal/registration.h
@@ -182,14 +182,13 @@ // We use a direct call to PrintUserValue because we don't have a // corpus_type object to pass to PrintValue. - bool first = true; - const auto print_one_arg = [&](auto I) { + auto print_one_arg = [seed, first = true](auto I) mutable { + if (!first) absl::FPrintF(stderr, ", "); + first = false; using value_type = std::decay_t<std::tuple_element_t<I, SeedT>>; AutodetectTypePrinter<value_type>().PrintUserValue( std::get<I>(seed), &std::cerr, domain_implementor::PrintMode::kHumanReadable); - if (!first) absl::FPrintF(stderr, ", "); - first = false; }; ApplyIndex<Base::kNumArgs>([&](auto... I) { (print_one_arg(I), ...); }); absl::FPrintF(stderr, "}\n\n");