CPerftSuite::CPerftSuite(void) { std::ifstream params; params.open("perftsuite.epd", std::ifstream::in); if (params.is_open()) { std::string line; int square = chess::A8; while (! params.eof()) { getline(params, line); if (line[0] == '#') continue; boost::char_separator<char> sep(";"); boost::char_separator<char> sep2(" "); boost::tokenizer<boost::char_separator<char>> toks(line, sep); // 1st tok is fen auto tok = toks.begin(); const std::string fen = *tok++; CBoard b; b.set_fen_position(fen); std::cout << b.fen() << " "; int depth = 1; while (tok != toks.end()) { boost::tokenizer<boost::char_separator<char>> toks2(*tok, sep2); auto tok2 = toks2.begin(); tok2++; uint64_t i = std::stoull(*tok2); if (i > 100000000) break; // takes too long CPerft p(b); auto res = p.DoPerft(depth); if (res.nodes == i) { std::cout << "."; } else { std::cout << "WRONG (depth " << depth << ": " << res.nodes << " != expected " << i << ")" << std::endl; ASSERT(res.nodes == i); break; } depth++; tok++; } } std::cout << "completed"; } }
void multiCompare3() const { // Original pattern that failed: "return|(|&&|%oror% %var% &&|%oror%|==|!=|<=|>=|<|>|-|%or% %var% )|&&|%oror%|;" // Code snippet that failed: "return lv@86 |= rv@87 ;" // Note: Also test "reverse" alternative pattern, two different code paths to handle it givenACodeSampleToTokenize toks("return a |= b ;", true); ASSERT_EQUALS(false, Token::Match(toks.tokens(), "return %var% xyz|%or% %var% ;")); ASSERT_EQUALS(false, Token::Match(toks.tokens(), "return %var% %or%|xyz %var% ;")); givenACodeSampleToTokenize toks2("return a | b ;", true); ASSERT_EQUALS(true, Token::Match(toks2.tokens(), "return %var% xyz|%or% %var% ;")); ASSERT_EQUALS(true, Token::Match(toks2.tokens(), "return %var% %or%|xyz %var% ;")); givenACodeSampleToTokenize toks3("return a || b ;", true); ASSERT_EQUALS(false, Token::Match(toks3.tokens(), "return %var% xyz|%or% %var% ;")); ASSERT_EQUALS(false, Token::Match(toks3.tokens(), "return %var% %or%|xyz %var% ;")); ASSERT_EQUALS(true, Token::Match(toks3.tokens(), "return %var% xyz|%oror% %var% ;")); ASSERT_EQUALS(true, Token::Match(toks3.tokens(), "return %var% %oror%|xyz %var% ;")); givenACodeSampleToTokenize toks4("a % b ;", true); ASSERT_EQUALS(true, Token::Match(toks4.tokens(), "%var% >>|<<|&|%or%|^|% %var% ;")); ASSERT_EQUALS(true, Token::Match(toks4.tokens(), "%var% %|>>|<<|&|%or%|^ %var% ;")); ASSERT_EQUALS(true, Token::Match(toks4.tokens(), "%var% >>|<<|&|%or%|%|^ %var% ;")); //%var%|%num% support givenACodeSampleToTokenize num("100", true); ASSERT_EQUALS(true, Token::Match(num.tokens(), "%num%|%var%")); ASSERT_EQUALS(true, Token::Match(num.tokens(), "%var%|%num%")); ASSERT_EQUALS(true, Token::Match(num.tokens(), "%var%|%num%|%bool%")); ASSERT_EQUALS(true, Token::Match(num.tokens(), "%var%|%bool%|%num%")); ASSERT_EQUALS(true, Token::Match(num.tokens(), "%var%|%bool%|%str%|%num%")); ASSERT_EQUALS(false, Token::Match(num.tokens(), "%bool%|%var%")); ASSERT_EQUALS(false, Token::Match(num.tokens(), "%type%|%bool%|%char%")); ASSERT_EQUALS(true, Token::Match(num.tokens(), "%type%|%bool%|100")); givenACodeSampleToTokenize numparen("( 100 )", true); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| %num%|%var% )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| %var%|%num% )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| %var%|%num%|%bool% )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| %var%|%bool%|%num% )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| %var%|%bool%|%str%|%num% )|")); ASSERT_EQUALS(false, Token::Match(numparen.tokens(), "(| %bool%|%var% )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| 100 %num%|%var%| )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| 100 %var%|%num%| )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| 100 %var%|%num%|%bool%| )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| 100 %var%|%bool%|%num%| )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| 100 %var%|%bool%|%str%|%num%| )|")); ASSERT_EQUALS(true, Token::Match(numparen.tokens(), "(| 100 %bool%|%var%| )|")); }