]> Dogcows Code - chaz/vimcoder/blobdiff - src/com/dogcows/resources/C++Driver
trailing whitespace cleanup
[chaz/vimcoder] / src / com / dogcows / resources / C++Driver
index 718ced40bbce7d119631781e0779d426ace63ded..89e00f0678349fa54f17d27c59bd8fef604cebf6 100644 (file)
@@ -1,6 +1,8 @@
 
 #include "$CLASSNAME$.cc"
 
+#include <algorithm>
+#include <cmath>
 #include <cstdlib>
 #include <fstream>
 #include <iostream>
@@ -12,6 +14,7 @@
 using namespace std;
 
 
+const static double __EPSILON = 1e-9;
 static double __time = 0.0;
 
 static void __timer_start()
@@ -64,10 +67,6 @@ std::istream& operator >> (std::istream& in, std::string& str)
                }
                str = s.str();
        }
-       else
-       {
-               in.putback(c);
-       }
 
        return in;
 }
@@ -90,25 +89,52 @@ std::istream& operator >> (std::istream& in, std::vector<T>& vec)
                        vec.push_back(t);
                        while (in.good() && std::isspace(in.peek())) in.get();
                }
+       }
+
+       return in;
+}
 
+template <class T>
+bool __equals(const T& actual, const T& expected)
+{
+       return actual == expected;
+}
+
+bool __equals(double actual, double expected)
+{
+       if (std::abs(actual - expected) < __EPSILON)
+       {
+               return true;
        }
        else
        {
-               in.putback(c);
+               double minimum = std::min(expected * (1.0 - __EPSILON), expected * (1.0 + __EPSILON));
+               double maximum = std::max(expected * (1.0 - __EPSILON), expected * (1.0 + __EPSILON));
+               return actual > minimum && actual < maximum;
        }
+}
 
-       return in;
+bool __equals(const std::vector<double>& actual, const std::vector<double>& expected)
+{
+       if (actual.size() != expected.size())
+               return false;
+
+       for (size_t i = 0; i < actual.size(); ++i)
+               if (!__equals(actual[i], expected[i]))
+                       return false;
+
+       return true;
 }
 
 
 int main(int argc, char* argv[])
 {
        bool    __exit_on_fail = false;
-       int             __pass = 0;
-       int             __fail = 0;
-       
+       int     __pass = 0;
+       int     __fail = 0;
+
        if (1 < argc) __exit_on_fail = true;
-       
+
        std::ifstream __in("testcases.txt");
        for(;;)
        {
@@ -116,19 +142,19 @@ int main(int argc, char* argv[])
                $METHODPARAMDECLARES$
                __in >> __expected >> $METHODPARAMSTREAMIN$;
                if (!__in.good()) break;
-               
+
                std::cout << "----------------------------------------" << std::endl
-                                 << "Test " << (__pass + __fail) << ": ";
+                         << "Test " << (__pass + __fail) << ": ";
                std::cout.flush();
-               
+
                __timer_start();
-               
+
                $CLASSNAME$ object;
                $RETURNTYPE$ __actual = object.$METHODNAME$($METHODPARAMNAMES$);
-               
+
                double __t = __timer_stop();
-               
-               if (__actual == __expected)
+
+               if (__equals(__actual, __expected))
                {
                        std::cout << "[PASS] in " << __t << " seconds." << std::endl;
                        ++__pass;
@@ -136,23 +162,23 @@ int main(int argc, char* argv[])
                else
                {
                        std::cout << "[FAIL] in " << __t << " seconds." << std::endl
-                                         << "->  Input: " << $METHODPARAMSTREAMOUT$ << std::endl
-                                         << "   Actual: " << __actual << std::endl
-                                         << " Expected: " << __expected << std::endl;
+                                 << "->  Input: " << $METHODPARAMSTREAMOUT$ << std::endl
+                                 << "   Actual: " << __actual << std::endl
+                                 << " Expected: " << __expected << std::endl;
                        ++__fail;
                        if (__exit_on_fail) exit(1);
                }
        }
 
        std::cout << "========================================" << std::endl
-                         << " Total Pass: " << __pass << std::endl
-                         << " Total Fail: " << __fail << std::endl;
+                 << " Total Pass: " << __pass << std::endl
+                 << " Total Fail: " << __fail << std::endl;
 
        if (__fail == 0)
        {
                std::cout << std::endl << "Nice!  "
-                                 << "Don't forget to compile remotely before submitting."
-                                 << std::endl;
+                         << "Don't forget to compile remotely before submitting."
+                         << std::endl;
        }
 
        return __fail;
This page took 0.0271 seconds and 4 git commands to generate.