X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcom%2Fdogcows%2Fresources%2FC%2B%2BDriver;h=24ab333609ffa5ed8a51c9c80f0b32943fe2fb19;hb=5e3d72f23da7634e1b87d005333eb7708ea78e4d;hp=718ced40bbce7d119631781e0779d426ace63ded;hpb=70fd7817176222991ace7906ecfd633c9b3eb272;p=chaz%2Fvimcoder diff --git a/src/com/dogcows/resources/C++Driver b/src/com/dogcows/resources/C++Driver index 718ced4..24ab333 100644 --- a/src/com/dogcows/resources/C++Driver +++ b/src/com/dogcows/resources/C++Driver @@ -1,6 +1,8 @@ #include "$CLASSNAME$.cc" +#include +#include #include #include #include @@ -12,6 +14,7 @@ using namespace std; +const static double __EPSILON = 1e-9; static double __time = 0.0; static void __timer_start() @@ -19,7 +22,7 @@ static void __timer_start() struct timeval tv; if (gettimeofday(&tv, NULL) == 0) { - __time = (double)tv.tv_sec + (double)tv.tv_usec * 0.000001; + __time = double(tv.tv_sec) + double(tv.tv_usec) * 0.000001; } } @@ -31,6 +34,12 @@ static double __timer_stop() } +static void __eat_whitespace(std::istream& in) +{ + while (in.good() && std::isspace(in.peek())) in.get(); +} + + std::ostream& operator << (std::ostream& out, const std::string& str) { out << '"' << str.c_str() << '"'; @@ -52,7 +61,7 @@ std::ostream& operator << (std::ostream& out, const std::vector& vec) std::istream& operator >> (std::istream& in, std::string& str) { - while (in.good() && std::isspace(in.peek())) in.get(); + __eat_whitespace(in); int c; if (in.good() && (c = in.get()) == '"') @@ -64,10 +73,6 @@ std::istream& operator >> (std::istream& in, std::string& str) } str = s.str(); } - else - { - in.putback(c); - } return in; } @@ -75,40 +80,70 @@ std::istream& operator >> (std::istream& in, std::string& str) template std::istream& operator >> (std::istream& in, std::vector& vec) { - while (in.good() && std::isspace(in.peek())) in.get(); + __eat_whitespace(in); int c; if (in.good() && (c = in.get()) == '{') { - while (in.good() && std::isspace(in.peek())) in.get(); - T t; + __eat_whitespace(in); vec.clear(); while (in.good() && (c = in.get()) != '}') { if (c != ',') in.putback(c); + + T t; in >> t; + __eat_whitespace(in); + vec.push_back(t); - while (in.good() && std::isspace(in.peek())) in.get(); } + } + return in; +} + + +template +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& actual, const std::vector& 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 +151,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 +171,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;