#include using namespace Upp; Vector errs; void AddError(int ln, const String& s) { errs.Add(AsString(ln) + ": " + s); } void Test(const char *path) { CppBase base; LOG("**** " << GetFileName(path)); FileIn in(path); errs.Clear(); Parser p; p.Do(in, Vector(), base, path, callback(AddError)); if(errs.GetCount()) DUMPC(errs); Qualify(base); String out; if(errs.GetCount()) out << "ERRORS: " << errs << '\n'; for(int i = 0; i < base.GetCount(); i++) { out << Nvl(base.GetKey(i), "") << " {\n"; const Array& ma = base[i]; for(int j = 0; j < ma.GetCount(); j++) { const CppItem& m = ma[j]; out << '\t' << CppItemKindAsString(m.kind) << ' ' << m.qitem << ", line " << m.line << "\n"; } out << "}\n"; } p.dobody = true; in.Seek(0); p.Do(in, Vector(), base, path, callback(AddError)); out << " {\n"; for(int i = 0; i < p.local.GetCount(); i++) { out << p.local.GetKey(i) << " " << p.local[i].type; if(p.local[i].isptr) out << " pointer"; out << ", line: " << p.local[i].line << "\n"; } out << "}"; LOG("===="); LOG(out); LOG("-------------------------------------------------------------------------------"); String h = LoadFile(ForceExt(path, ".out")); h.Replace("\r", ""); ASSERT(out == h); } CONSOLE_APP_MAIN { StdLogSetup(LOG_COUT|LOG_FILE); FindFile ff(GetDataFile("*.in")); while(ff) { Test(ff.GetPath()); ff.Next(); } LOG("=========== OK"); }