1ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "FuzzerInternal.h"
2ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "gtest/gtest.h"
3ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include <set>
4ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
5ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// For now, have TestOneInput just to make it link.
6ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// Later we may want to make unittests that actually call TestOneInput.
7ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesextern "C" void TestOneInput(const uint8_t *Data, size_t Size) {
8ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  abort();
9ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
10ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
11ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTEST(Fuzzer, CrossOver) {
12ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  using namespace fuzzer;
13ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Unit A({0, 1, 2}), B({5, 6, 7});
14ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Unit C;
15ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Unit Expected[] = {
16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0 },
17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1 },
18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5 },
19ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 2 },
20ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5 },
21ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1 },
22ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6 },
23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 2, 5 },
24ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5, 2 },
25ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5, 6 },
26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1, 2 },
27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1, 6 },
28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6, 1 },
29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6, 7 },
30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 2, 5, 6 },
31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5, 2, 6 },
32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5, 6, 2 },
33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5, 6, 7 },
34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1, 2, 6 },
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1, 6, 2 },
36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1, 6, 7 },
37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6, 1, 2 },
38ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6, 1, 7 },
39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6, 7, 1 },
40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 2, 5, 6, 7 },
41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5, 2, 6, 7 },
42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5, 6, 2, 7 },
43ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 1, 5, 6, 7, 2 },
44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1, 2, 6, 7 },
45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1, 6, 2, 7 },
46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 1, 6, 7, 2 },
47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6, 1, 2, 7 },
48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6, 1, 7, 2 },
49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines       { 0, 5, 6, 7, 1, 2 }
50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  };
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  for (size_t Len = 1; Len < 8; Len++) {
52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    std::set<Unit> FoundUnits, ExpectedUnitsWitThisLength;
53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    for (int Iter = 0; Iter < 3000; Iter++) {
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      CrossOver(A, B, &C, Len);
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      FoundUnits.insert(C);
56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    for (const Unit &U : Expected)
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      if (U.size() <= Len)
59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines        ExpectedUnitsWitThisLength.insert(U);
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    EXPECT_EQ(ExpectedUnitsWitThisLength, FoundUnits);
61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
63