xref: /aosp_15_r20/external/double-conversion/test/cctest/cctest.cc (revision a6021da3bd53a1cb979b0905bbb837249345d1b1)
1*a6021da3SAndroid Build Coastguard Worker // Copyright 2008 the V8 project authors. All rights reserved.
2*a6021da3SAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
3*a6021da3SAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
4*a6021da3SAndroid Build Coastguard Worker // met:
5*a6021da3SAndroid Build Coastguard Worker //
6*a6021da3SAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
7*a6021da3SAndroid Build Coastguard Worker //       notice, this list of conditions and the following disclaimer.
8*a6021da3SAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
9*a6021da3SAndroid Build Coastguard Worker //       copyright notice, this list of conditions and the following
10*a6021da3SAndroid Build Coastguard Worker //       disclaimer in the documentation and/or other materials provided
11*a6021da3SAndroid Build Coastguard Worker //       with the distribution.
12*a6021da3SAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
13*a6021da3SAndroid Build Coastguard Worker //       contributors may be used to endorse or promote products derived
14*a6021da3SAndroid Build Coastguard Worker //       from this software without specific prior written permission.
15*a6021da3SAndroid Build Coastguard Worker //
16*a6021da3SAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17*a6021da3SAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18*a6021da3SAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19*a6021da3SAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20*a6021da3SAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21*a6021da3SAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22*a6021da3SAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23*a6021da3SAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24*a6021da3SAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25*a6021da3SAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26*a6021da3SAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*a6021da3SAndroid Build Coastguard Worker 
28*a6021da3SAndroid Build Coastguard Worker #include "cctest.h"
29*a6021da3SAndroid Build Coastguard Worker #include <stdio.h>
30*a6021da3SAndroid Build Coastguard Worker #include <stdlib.h>
31*a6021da3SAndroid Build Coastguard Worker #include <string.h>
32*a6021da3SAndroid Build Coastguard Worker 
33*a6021da3SAndroid Build Coastguard Worker 
34*a6021da3SAndroid Build Coastguard Worker CcTest* CcTest::last_ = NULL;
35*a6021da3SAndroid Build Coastguard Worker 
36*a6021da3SAndroid Build Coastguard Worker // The windows compiler doesn't like to use `strdup`, and claims it's a
37*a6021da3SAndroid Build Coastguard Worker // deprecated name.
38*a6021da3SAndroid Build Coastguard Worker // For simplicity just implement it ourselves.
Strdup(const char * str)39*a6021da3SAndroid Build Coastguard Worker static char* Strdup(const char* str) {
40*a6021da3SAndroid Build Coastguard Worker   size_t len = strlen(str);
41*a6021da3SAndroid Build Coastguard Worker   char* result = reinterpret_cast<char*>(malloc(len + 1));
42*a6021da3SAndroid Build Coastguard Worker   memcpy(result, str, len + 1);
43*a6021da3SAndroid Build Coastguard Worker   return result;
44*a6021da3SAndroid Build Coastguard Worker }
45*a6021da3SAndroid Build Coastguard Worker 
CcTest(TestFunction * callback,const char * test_file,const char * test_name,const char * test_dependency,bool test_is_enabled)46*a6021da3SAndroid Build Coastguard Worker CcTest::CcTest(TestFunction* callback, const char* test_file,
47*a6021da3SAndroid Build Coastguard Worker                const char* test_name, const char* test_dependency,
48*a6021da3SAndroid Build Coastguard Worker                bool test_is_enabled)
49*a6021da3SAndroid Build Coastguard Worker     : callback_(callback), name_(test_name), dependency_(test_dependency),
50*a6021da3SAndroid Build Coastguard Worker       prev_(last_) {
51*a6021da3SAndroid Build Coastguard Worker   // Find the base name of this test (const_cast required on Windows).
52*a6021da3SAndroid Build Coastguard Worker   char *basename = strrchr(const_cast<char *>(test_file), '/');
53*a6021da3SAndroid Build Coastguard Worker   if (!basename) {
54*a6021da3SAndroid Build Coastguard Worker     basename = strrchr(const_cast<char *>(test_file), '\\');
55*a6021da3SAndroid Build Coastguard Worker   }
56*a6021da3SAndroid Build Coastguard Worker   if (!basename) {
57*a6021da3SAndroid Build Coastguard Worker     basename = Strdup(test_file);
58*a6021da3SAndroid Build Coastguard Worker   } else {
59*a6021da3SAndroid Build Coastguard Worker     basename = Strdup(basename + 1);
60*a6021da3SAndroid Build Coastguard Worker   }
61*a6021da3SAndroid Build Coastguard Worker   // Drop the extension, if there is one.
62*a6021da3SAndroid Build Coastguard Worker   char *extension = strrchr(basename, '.');
63*a6021da3SAndroid Build Coastguard Worker   if (extension) *extension = 0;
64*a6021da3SAndroid Build Coastguard Worker   // Install this test in the list of tests
65*a6021da3SAndroid Build Coastguard Worker   file_ = basename;
66*a6021da3SAndroid Build Coastguard Worker   enabled_ = test_is_enabled;
67*a6021da3SAndroid Build Coastguard Worker   prev_ = last_;
68*a6021da3SAndroid Build Coastguard Worker   last_ = this;
69*a6021da3SAndroid Build Coastguard Worker }
70*a6021da3SAndroid Build Coastguard Worker 
71*a6021da3SAndroid Build Coastguard Worker 
PrintTestList(CcTest * current)72*a6021da3SAndroid Build Coastguard Worker static void PrintTestList(CcTest* current) {
73*a6021da3SAndroid Build Coastguard Worker   if (current == NULL) return;
74*a6021da3SAndroid Build Coastguard Worker   PrintTestList(current->prev());
75*a6021da3SAndroid Build Coastguard Worker   if (current->dependency() != NULL) {
76*a6021da3SAndroid Build Coastguard Worker     printf("%s/%s<%s\n",
77*a6021da3SAndroid Build Coastguard Worker            current->file(), current->name(), current->dependency());
78*a6021da3SAndroid Build Coastguard Worker   } else {
79*a6021da3SAndroid Build Coastguard Worker     printf("%s/%s<\n", current->file(), current->name());
80*a6021da3SAndroid Build Coastguard Worker   }
81*a6021da3SAndroid Build Coastguard Worker }
82*a6021da3SAndroid Build Coastguard Worker 
83*a6021da3SAndroid Build Coastguard Worker 
main(int argc,char * argv[])84*a6021da3SAndroid Build Coastguard Worker int main(int argc, char* argv[]) {
85*a6021da3SAndroid Build Coastguard Worker   int tests_run = 0;
86*a6021da3SAndroid Build Coastguard Worker   bool print_run_count = true;
87*a6021da3SAndroid Build Coastguard Worker   if (argc == 1) {
88*a6021da3SAndroid Build Coastguard Worker     // Just run all the tests.
89*a6021da3SAndroid Build Coastguard Worker     CcTest* test = CcTest::last();
90*a6021da3SAndroid Build Coastguard Worker     while (test != NULL) {
91*a6021da3SAndroid Build Coastguard Worker       if (test->enabled()) {
92*a6021da3SAndroid Build Coastguard Worker         test->Run();
93*a6021da3SAndroid Build Coastguard Worker         tests_run++;
94*a6021da3SAndroid Build Coastguard Worker       }
95*a6021da3SAndroid Build Coastguard Worker       test = test->prev();
96*a6021da3SAndroid Build Coastguard Worker     }
97*a6021da3SAndroid Build Coastguard Worker   }
98*a6021da3SAndroid Build Coastguard Worker   for (int i = 1; i < argc; i++) {
99*a6021da3SAndroid Build Coastguard Worker     char* arg = argv[i];
100*a6021da3SAndroid Build Coastguard Worker     if (strcmp(arg, "--list") == 0) {
101*a6021da3SAndroid Build Coastguard Worker       PrintTestList(CcTest::last());
102*a6021da3SAndroid Build Coastguard Worker       print_run_count = false;
103*a6021da3SAndroid Build Coastguard Worker 
104*a6021da3SAndroid Build Coastguard Worker     } else {
105*a6021da3SAndroid Build Coastguard Worker       char* arg_copy = Strdup(arg);
106*a6021da3SAndroid Build Coastguard Worker       char* testname = strchr(arg_copy, '/');
107*a6021da3SAndroid Build Coastguard Worker       if (testname) {
108*a6021da3SAndroid Build Coastguard Worker         // Split the string in two by nulling the slash and then run
109*a6021da3SAndroid Build Coastguard Worker         // exact matches.
110*a6021da3SAndroid Build Coastguard Worker         *testname = 0;
111*a6021da3SAndroid Build Coastguard Worker         char* file = arg_copy;
112*a6021da3SAndroid Build Coastguard Worker         char* name = testname + 1;
113*a6021da3SAndroid Build Coastguard Worker         CcTest* test = CcTest::last();
114*a6021da3SAndroid Build Coastguard Worker         while (test != NULL) {
115*a6021da3SAndroid Build Coastguard Worker           if (test->enabled()
116*a6021da3SAndroid Build Coastguard Worker               && strcmp(test->file(), file) == 0
117*a6021da3SAndroid Build Coastguard Worker               && strcmp(test->name(), name) == 0) {
118*a6021da3SAndroid Build Coastguard Worker             test->Run();
119*a6021da3SAndroid Build Coastguard Worker             tests_run++;
120*a6021da3SAndroid Build Coastguard Worker           }
121*a6021da3SAndroid Build Coastguard Worker           test = test->prev();
122*a6021da3SAndroid Build Coastguard Worker         }
123*a6021da3SAndroid Build Coastguard Worker 
124*a6021da3SAndroid Build Coastguard Worker       } else {
125*a6021da3SAndroid Build Coastguard Worker         // Run all tests with the specified file or test name.
126*a6021da3SAndroid Build Coastguard Worker         char* file_or_name = arg_copy;
127*a6021da3SAndroid Build Coastguard Worker         CcTest* test = CcTest::last();
128*a6021da3SAndroid Build Coastguard Worker         while (test != NULL) {
129*a6021da3SAndroid Build Coastguard Worker           if (test->enabled()
130*a6021da3SAndroid Build Coastguard Worker               && (strcmp(test->file(), file_or_name) == 0
131*a6021da3SAndroid Build Coastguard Worker                   || strcmp(test->name(), file_or_name) == 0)) {
132*a6021da3SAndroid Build Coastguard Worker             test->Run();
133*a6021da3SAndroid Build Coastguard Worker             tests_run++;
134*a6021da3SAndroid Build Coastguard Worker           }
135*a6021da3SAndroid Build Coastguard Worker           test = test->prev();
136*a6021da3SAndroid Build Coastguard Worker         }
137*a6021da3SAndroid Build Coastguard Worker       }
138*a6021da3SAndroid Build Coastguard Worker       free(arg_copy);
139*a6021da3SAndroid Build Coastguard Worker     }
140*a6021da3SAndroid Build Coastguard Worker   }
141*a6021da3SAndroid Build Coastguard Worker   if (print_run_count && tests_run != 1)
142*a6021da3SAndroid Build Coastguard Worker     printf("Ran %i tests.\n", tests_run);
143*a6021da3SAndroid Build Coastguard Worker   return 0;
144*a6021da3SAndroid Build Coastguard Worker }
145