#include #include #include #include std::ostream& operator<<(std::ostream& stream, const Language& lang) { switch(lang) { case Language::Auto: stream << "Language::Auto"; break; case Language::C: stream << "Language::C"; break; case Language::Cpp: stream << "Language::Cpp"; break; case Language::Asm: stream << "Language::Asm"; break; } return stream; } class TestableTaskCC : public TaskCC { public: TestableTaskCC(const Source& source) : TaskCC({}, {}, "build", source) {} Language language() const { return source_language; } }; class SourceTypeTest : public uUnit { public: SourceTypeTest() { uTEST(SourceTypeTest::test); } void test() { { // c++ TestableTaskCC task("hello.cc"); uASSERT_EQUAL(Language::Cpp, task.language()); } { // c TestableTaskCC task("hello.c"); uASSERT_EQUAL(Language::C, task.language()); } { // asm TestableTaskCC task("hello.s"); uASSERT_EQUAL(Language::Asm, task.language()); } { // custom/explicit language TestableTaskCC task( {"hello.foo", Language::Asm} ); uASSERT_EQUAL(Language::Asm, task.language()); } // Note: Failure state will result in exit(1) so cannot be tested } }; // Registers the fixture into the 'registry' static SourceTypeTest test;