1c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes
2c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes#undef NDEBUG
3c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes
4c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes#include "benchmark/benchmark.h"
5c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes#include "output_test.h"
6c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes
7020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// @todo: <jpmag> this checks the full output at once; the rule for
8020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// CounterSet1 was failing because it was not matching "^[-]+$".
9020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// @todo: <jpmag> check that the counters are vertically aligned.
10020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_ConsoleOut, {
11020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// keeping these lines long improves readability, so:
12020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// clang-format off
13020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^[-]+$", MR_Next},
14020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^Benchmark %s Time %s CPU %s Iterations %s Bar %s Bat %s Baz %s Foo %s Frob %s Lob$", MR_Next},
15020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^[-]+$", MR_Next},
16020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
17020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
18020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
19020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
20020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_Counters_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
21020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next},
22020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next},
23020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next},
24020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next},
25020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterRates_Tabular/threads:%int %console_report [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s [ ]*%hrfloat/s$", MR_Next},
26020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^[-]+$", MR_Next},
27020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^Benchmark %s Time %s CPU %s Iterations %s Bar %s Baz %s Foo$", MR_Next},
28020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^[-]+$", MR_Next},
29020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
30020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
31020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
32020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
33020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet0_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
34020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
35020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
36020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
37020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
38020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet1_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
39020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^[-]+$", MR_Next},
40020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^Benchmark %s Time %s CPU %s Iterations %s Bat %s Baz %s Foo$", MR_Next},
41020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^[-]+$", MR_Next},
42020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
43020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
44020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
45020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$", MR_Next},
46020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"^BM_CounterSet2_Tabular/threads:%int %console_report [ ]*%hrfloat [ ]*%hrfloat [ ]*%hrfloat$"},
47020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// clang-format on
48020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes});
49020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_CSVOut, {{"%csv_header,"
50020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       "\"Bar\",\"Bat\",\"Baz\",\"Foo\",\"Frob\",\"Lob\""}});
51c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes
52c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes// ========================================================================= //
53c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes// ------------------------- Tabular Counters Output ----------------------- //
54c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes// ========================================================================= //
55c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes
56c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaesvoid BM_Counters_Tabular(benchmark::State& state) {
5725acf220a44ccc41104a690731fcf646cc3e8192Eric  for (auto _ : state) {
58c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  }
59020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  namespace bm = benchmark;
60c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  state.counters.insert({
61020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Foo",  { 1, bm::Counter::kAvgThreads}},
62020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Bar",  { 2, bm::Counter::kAvgThreads}},
63020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Baz",  { 4, bm::Counter::kAvgThreads}},
64020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Bat",  { 8, bm::Counter::kAvgThreads}},
65020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Frob", {16, bm::Counter::kAvgThreads}},
66020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Lob",  {32, bm::Counter::kAvgThreads}},
67c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  });
68c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes}
69020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesBENCHMARK(BM_Counters_Tabular)->ThreadRange(1, 16);
70020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_JSONOut, {{"\"name\": \"BM_Counters_Tabular/threads:%int\",$"},
713347a20e0e7aff733371cdc2ec371ea73bfdcecbRoman Lebedev                       {"\"iterations\": %int,$", MR_Next},
72b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"real_time\": %float,$", MR_Next},
73b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"cpu_time\": %float,$", MR_Next},
74c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       {"\"time_unit\": \"ns\",$", MR_Next},
75c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       {"\"Bar\": %float,$", MR_Next},
76c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       {"\"Bat\": %float,$", MR_Next},
77c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       {"\"Baz\": %float,$", MR_Next},
78c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       {"\"Foo\": %float,$", MR_Next},
79c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       {"\"Frob\": %float,$", MR_Next},
80c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       {"\"Lob\": %float$", MR_Next},
81c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       {"}", MR_Next}});
82020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_CSVOut, {{"^\"BM_Counters_Tabular/threads:%int\",%csv_report,"
83c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes                       "%float,%float,%float,%float,%float,%float$"}});
84c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes// VS2013 does not allow this function to be passed as a lambda argument
85c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes// to CHECK_BENCHMARK_RESULTS()
86c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaesvoid CheckTabular(Results const& e) {
87c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Foo", EQ, 1);
88c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Bar", EQ, 2);
89c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Baz", EQ, 4);
90c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Bat", EQ, 8);
91c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Frob", EQ, 16);
92c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Lob", EQ, 32);
93c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes}
94020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesCHECK_BENCHMARK_RESULTS("BM_Counters_Tabular/threads:%int", &CheckTabular);
95c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes
96c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes// ========================================================================= //
97cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes// -------------------- Tabular+Rate Counters Output ----------------------- //
98cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes// ========================================================================= //
99cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes
100cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaesvoid BM_CounterRates_Tabular(benchmark::State& state) {
10125acf220a44ccc41104a690731fcf646cc3e8192Eric  for (auto _ : state) {
102cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  }
103cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  namespace bm = benchmark;
104cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  state.counters.insert({
105020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Foo",  { 1, bm::Counter::kAvgThreadsRate}},
106020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Bar",  { 2, bm::Counter::kAvgThreadsRate}},
107020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Baz",  { 4, bm::Counter::kAvgThreadsRate}},
108020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Bat",  { 8, bm::Counter::kAvgThreadsRate}},
109020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Frob", {16, bm::Counter::kAvgThreadsRate}},
110020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Lob",  {32, bm::Counter::kAvgThreadsRate}},
111cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  });
112cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes}
113020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesBENCHMARK(BM_CounterRates_Tabular)->ThreadRange(1, 16);
114020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_JSONOut, {{"\"name\": \"BM_CounterRates_Tabular/threads:%int\",$"},
1153347a20e0e7aff733371cdc2ec371ea73bfdcecbRoman Lebedev                       {"\"iterations\": %int,$", MR_Next},
116b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"real_time\": %float,$", MR_Next},
117b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"cpu_time\": %float,$", MR_Next},
118cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       {"\"time_unit\": \"ns\",$", MR_Next},
119cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       {"\"Bar\": %float,$", MR_Next},
120cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       {"\"Bat\": %float,$", MR_Next},
121cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       {"\"Baz\": %float,$", MR_Next},
122cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       {"\"Foo\": %float,$", MR_Next},
123cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       {"\"Frob\": %float,$", MR_Next},
124cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       {"\"Lob\": %float$", MR_Next},
125cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       {"}", MR_Next}});
126020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_CSVOut, {{"^\"BM_CounterRates_Tabular/threads:%int\",%csv_report,"
127cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes                       "%float,%float,%float,%float,%float,%float$"}});
128cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes// VS2013 does not allow this function to be passed as a lambda argument
129cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes// to CHECK_BENCHMARK_RESULTS()
130cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaesvoid CheckTabularRate(Results const& e) {
131cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  double t = e.DurationCPUTime();
132cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  CHECK_FLOAT_COUNTER_VALUE(e, "Foo", EQ, 1./t, 0.001);
133cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  CHECK_FLOAT_COUNTER_VALUE(e, "Bar", EQ, 2./t, 0.001);
134cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  CHECK_FLOAT_COUNTER_VALUE(e, "Baz", EQ, 4./t, 0.001);
135cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  CHECK_FLOAT_COUNTER_VALUE(e, "Bat", EQ, 8./t, 0.001);
136cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  CHECK_FLOAT_COUNTER_VALUE(e, "Frob", EQ, 16./t, 0.001);
137cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes  CHECK_FLOAT_COUNTER_VALUE(e, "Lob", EQ, 32./t, 0.001);
138cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes}
139020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesCHECK_BENCHMARK_RESULTS("BM_CounterRates_Tabular/threads:%int",
140020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                        &CheckTabularRate);
141cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes
142cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes// ========================================================================= //
14325060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes// ------------------------- Tabular Counters Output ----------------------- //
144c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes// ========================================================================= //
145c69b385c9ce92ce4b05c3109cfdb8086d75600d6Joao Paulo Magalhaes
14625060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes// set only some of the counters
147020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaesvoid BM_CounterSet0_Tabular(benchmark::State& state) {
14825acf220a44ccc41104a690731fcf646cc3e8192Eric  for (auto _ : state) {
14925060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes  }
150020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  namespace bm = benchmark;
15125060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes  state.counters.insert({
152020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Foo", {10, bm::Counter::kAvgThreads}},
153020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Bar", {20, bm::Counter::kAvgThreads}},
154020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Baz", {40, bm::Counter::kAvgThreads}},
15525060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes  });
156cf20dc967f2cf5307ca6e4bc06a36490c1b5c835Joao Paulo Magalhaes}
157020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesBENCHMARK(BM_CounterSet0_Tabular)->ThreadRange(1, 16);
158020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_JSONOut, {{"\"name\": \"BM_CounterSet0_Tabular/threads:%int\",$"},
1593347a20e0e7aff733371cdc2ec371ea73bfdcecbRoman Lebedev                       {"\"iterations\": %int,$", MR_Next},
160b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"real_time\": %float,$", MR_Next},
161b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"cpu_time\": %float,$", MR_Next},
16225060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes                       {"\"time_unit\": \"ns\",$", MR_Next},
16325060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes                       {"\"Bar\": %float,$", MR_Next},
16425060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes                       {"\"Baz\": %float,$", MR_Next},
16525060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes                       {"\"Foo\": %float$", MR_Next},
16625060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes                       {"}", MR_Next}});
167020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_CSVOut, {{"^\"BM_CounterSet0_Tabular/threads:%int\",%csv_report,"
16825060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes                       "%float,,%float,%float,,"}});
16925060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes// VS2013 does not allow this function to be passed as a lambda argument
17025060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes// to CHECK_BENCHMARK_RESULTS()
171020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaesvoid CheckSet0(Results const& e) {
17225060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Foo", EQ, 10);
17325060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Bar", EQ, 20);
17425060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Baz", EQ, 40);
17525060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes}
176020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesCHECK_BENCHMARK_RESULTS("BM_CounterSet0_Tabular", &CheckSet0);
177020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes
178020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// again.
179020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaesvoid BM_CounterSet1_Tabular(benchmark::State& state) {
18025acf220a44ccc41104a690731fcf646cc3e8192Eric  for (auto _ : state) {
181020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  }
182020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  namespace bm = benchmark;
183020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  state.counters.insert({
184020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Foo", {15, bm::Counter::kAvgThreads}},
185020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Bar", {25, bm::Counter::kAvgThreads}},
186020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Baz", {45, bm::Counter::kAvgThreads}},
187020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  });
188020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes}
189020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesBENCHMARK(BM_CounterSet1_Tabular)->ThreadRange(1, 16);
190020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_JSONOut, {{"\"name\": \"BM_CounterSet1_Tabular/threads:%int\",$"},
1913347a20e0e7aff733371cdc2ec371ea73bfdcecbRoman Lebedev                       {"\"iterations\": %int,$", MR_Next},
192b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"real_time\": %float,$", MR_Next},
193b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"cpu_time\": %float,$", MR_Next},
194020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"\"time_unit\": \"ns\",$", MR_Next},
195020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"\"Bar\": %float,$", MR_Next},
196020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"\"Baz\": %float,$", MR_Next},
197020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"\"Foo\": %float$", MR_Next},
198020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"}", MR_Next}});
199020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_CSVOut, {{"^\"BM_CounterSet1_Tabular/threads:%int\",%csv_report,"
200020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       "%float,,%float,%float,,"}});
201020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// VS2013 does not allow this function to be passed as a lambda argument
202020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// to CHECK_BENCHMARK_RESULTS()
203020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaesvoid CheckSet1(Results const& e) {
204020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Foo", EQ, 15);
205020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Bar", EQ, 25);
206020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Baz", EQ, 45);
207020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes}
208020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesCHECK_BENCHMARK_RESULTS("BM_CounterSet1_Tabular/threads:%int", &CheckSet1);
209020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes
210020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// ========================================================================= //
211020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// ------------------------- Tabular Counters Output ----------------------- //
212020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// ========================================================================= //
213020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes
214020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// set only some of the counters, different set now.
215020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaesvoid BM_CounterSet2_Tabular(benchmark::State& state) {
21625acf220a44ccc41104a690731fcf646cc3e8192Eric  for (auto _ : state) {
217020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  }
218020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  namespace bm = benchmark;
219020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  state.counters.insert({
220020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Foo", {10, bm::Counter::kAvgThreads}},
221020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Bat", {30, bm::Counter::kAvgThreads}},
222020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes    {"Baz", {40, bm::Counter::kAvgThreads}},
223020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  });
224020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes}
225020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesBENCHMARK(BM_CounterSet2_Tabular)->ThreadRange(1, 16);
226020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_JSONOut, {{"\"name\": \"BM_CounterSet2_Tabular/threads:%int\",$"},
2273347a20e0e7aff733371cdc2ec371ea73bfdcecbRoman Lebedev                       {"\"iterations\": %int,$", MR_Next},
228b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"real_time\": %float,$", MR_Next},
229b9be142d1e2dbc06cf2efd44919f6c422c43cddbRoman Lebedev                       {"\"cpu_time\": %float,$", MR_Next},
230020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"\"time_unit\": \"ns\",$", MR_Next},
231020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"\"Bat\": %float,$", MR_Next},
232020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"\"Baz\": %float,$", MR_Next},
233020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"\"Foo\": %float$", MR_Next},
234020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       {"}", MR_Next}});
235020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesADD_CASES(TC_CSVOut, {{"^\"BM_CounterSet2_Tabular/threads:%int\",%csv_report,"
236020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes                       ",%float,%float,%float,,"}});
237020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// VS2013 does not allow this function to be passed as a lambda argument
238020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes// to CHECK_BENCHMARK_RESULTS()
239020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaesvoid CheckSet2(Results const& e) {
240020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Foo", EQ, 10);
241020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Bat", EQ, 30);
242020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes  CHECK_COUNTER_VALUE(e, int, "Baz", EQ, 40);
243020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo Magalhaes}
244020bac985b93308750b90cca6921b7425ca57b3dJoao Paulo MagalhaesCHECK_BENCHMARK_RESULTS("BM_CounterSet2_Tabular", &CheckSet2);
24525060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes
24625060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes// ========================================================================= //
24725060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes// --------------------------- TEST CASES END ------------------------------ //
24825060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes// ========================================================================= //
24925060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaes
25025060449020a5f1e739064fc155ca7c4c94935a1Joao Paulo Magalhaesint main(int argc, char* argv[]) { RunOutputTests(argc, argv); }
251