Skip to content

Commit

Permalink
Refactor: Extract interfaces from *Logger
Browse files Browse the repository at this point in the history
  • Loading branch information
fushar committed May 27, 2017
1 parent 55a338d commit d56377f
Show file tree
Hide file tree
Showing 17 changed files with 282 additions and 200 deletions.
9 changes: 6 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,14 @@ set(INCLUDE
include/tcframe/evaluator/scorer/Scorer.hpp
include/tcframe/evaluator/scorer/ScoringResult.hpp
include/tcframe/generator.hpp
include/tcframe/generator/DefaultGeneratorLogger.hpp
include/tcframe/generator/GenerationException.hpp
include/tcframe/generator/GenerationOptions.hpp
include/tcframe/generator/Generator.hpp
include/tcframe/generator/GeneratorLogger.hpp
include/tcframe/generator/TestCaseGenerator.hpp
include/tcframe/grader.hpp
include/tcframe/grader/DefaultGraderLogger.hpp
include/tcframe/grader/Grader.hpp
include/tcframe/grader/GraderLogger.hpp
include/tcframe/grader/GradingOptions.hpp
Expand All @@ -85,6 +87,7 @@ set(INCLUDE
include/tcframe/io_manipulator/RawLinesIOSegmentManipulator.hpp
include/tcframe/logger.hpp
include/tcframe/logger/BaseLogger.hpp
include/tcframe/logger/DefaultBaseLogger.hpp
include/tcframe/logger/LoggerEngine.hpp
include/tcframe/logger/SimpleLoggerEngine.hpp
include/tcframe/os.hpp
Expand Down Expand Up @@ -165,14 +168,14 @@ set(TEST_UNIT
test/unit/tcframe/evaluator/communicator/MockCommunicator.hpp
test/unit/tcframe/evaluator/scorer/CustomScorerTests.cpp
test/unit/tcframe/evaluator/scorer/MockScorer.hpp
test/unit/tcframe/generator/GeneratorLoggerTests.cpp
test/unit/tcframe/generator/DefaultGeneratorLoggerTests.cpp
test/unit/tcframe/generator/GeneratorTests.cpp
test/unit/tcframe/generator/MockGenerator.hpp
test/unit/tcframe/generator/MockGeneratorLogger.hpp
test/unit/tcframe/generator/MockTestCaseGenerator.hpp
test/unit/tcframe/generator/TestCaseGeneratorTests.cpp
test/unit/tcframe/grader/DefaultGraderLoggerTests.cpp
test/unit/tcframe/grader/GraderTests.cpp
test/unit/tcframe/grader/GraderLoggerTests.cpp
test/unit/tcframe/grader/MockGrader.hpp
test/unit/tcframe/grader/MockGraderLogger.hpp
test/unit/tcframe/grader/MockTestCaseGrader.hpp
Expand All @@ -184,7 +187,7 @@ set(TEST_UNIT
test/unit/tcframe/io_manipulator/MockIOManipulator.hpp
test/unit/tcframe/io_manipulator/RawLineIOSegmentManipulatorTests.cpp
test/unit/tcframe/io_manipulator/RawLinesIOSegmentManipulatorTests.cpp
test/unit/tcframe/logger/BaseLogggerTests.cpp
test/unit/tcframe/logger/DefaultBaseLogggerTests.cpp
test/unit/tcframe/logger/MockLoggerEngine.hpp
test/unit/tcframe/logger/SimpleLoggerEngineTests.cpp
test/unit/tcframe/os/MockOperatingSystem.hpp
Expand Down
1 change: 1 addition & 0 deletions include/tcframe/generator.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include "tcframe/generator/DefaultGeneratorLogger.hpp"
#include "tcframe/generator/GenerationException.hpp"
#include "tcframe/generator/GenerationOptions.hpp"
#include "tcframe/generator/Generator.hpp"
Expand Down
107 changes: 107 additions & 0 deletions include/tcframe/generator/DefaultGeneratorLogger.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#pragma once

#include <iostream>
#include <string>
#include <vector>

#include "GeneratorLogger.hpp"
#include "tcframe/logger.hpp"
#include "tcframe/spec/constraint.hpp"
#include "tcframe/util.hpp"
#include "tcframe/verifier.hpp"

using std::string;
using std::vector;

namespace tcframe {

class DefaultGeneratorLogger : public GeneratorLogger, public DefaultBaseLogger {
public:
virtual ~DefaultGeneratorLogger() {}

DefaultGeneratorLogger(LoggerEngine* engine)
: DefaultBaseLogger(engine) {}

virtual void logIntroduction() {
engine_->logParagraph(0, "Generating test cases...");
}

virtual void logSuccessfulResult() {
engine_->logParagraph(0, "");
engine_->logParagraph(0, "Generation finished. All test cases OK.");
}

virtual void logFailedResult() {
engine_->logParagraph(0, "");
engine_->logParagraph(0, "Generation finished. Some test cases FAILED.");
}

virtual void logTestCaseSuccessfulResult() {
engine_->logParagraph(0, "OK");
}

virtual void logTestCaseFailedResult(const optional<string>& testCaseDescription) {
engine_->logParagraph(0, "FAILED");
if (testCaseDescription) {
engine_->logParagraph(2, "Description: " + testCaseDescription.value());
}
engine_->logParagraph(2, "Reasons:");
}

virtual void logMultipleTestCasesCombinationIntroduction(const string& testGroupName) {
engine_->logHangingParagraph(1, "Combining test cases into a single file (" + testGroupName + "): ");
}

virtual void logMultipleTestCasesCombinationSuccessfulResult() {
engine_->logParagraph(0, "OK");
}

virtual void logMultipleTestCasesCombinationFailedResult() {
engine_->logParagraph(0, "FAILED");
engine_->logParagraph(2, "Reasons:");
}

virtual void logConstraintsVerificationFailure(const ConstraintsVerificationResult& result) {
for (const auto& entry : result.unsatisfiedConstraintDescriptionsBySubtaskId()) {
int subtaskId = entry.first;
const vector<string>& unsatisfiedConstraintDescriptions = entry.second;

if (subtaskId == Subtask::MAIN_ID) {
engine_->logListItem1(2, "Does not satisfy constraints, on:");
} else {
engine_->logListItem1(2, "Does not satisfy subtask " + StringUtils::toString(subtaskId) + ", on constraints:");
}

for (const string& unsatisfiedConstraintDescription : unsatisfiedConstraintDescriptions) {
engine_->logListItem2(3, unsatisfiedConstraintDescription);
}
}
for (int subtaskId : result.satisfiedButNotAssignedSubtaskIds()) {
engine_->logListItem1(2, "Satisfies subtask " + StringUtils::toString(subtaskId) + " but is not assigned to it");
}
}

virtual void logMultipleTestCasesConstraintsVerificationFailure(
const MultipleTestCasesConstraintsVerificationResult& result) {

engine_->logListItem1(2, "Does not satisfy constraints, on:");

for (const string& unsatisfiedConstraintDescription : result.unsatisfiedConstraintDescriptions()) {
engine_->logListItem2(3, unsatisfiedConstraintDescription);
}
}

virtual void logSampleTestCaseCheckFailure() {
engine_->logListItem1(2, "Sample test case output does not match with actual output produced by the solution");
}

virtual void logSampleTestCaseNoOutputNeededFailure() {
engine_->logListItem1(2, "Problem does not need test case outputs, but this sample test case has output");
}

virtual void logSimpleFailure(const string& message) {
engine_->logListItem1(2, message);
}
};

}
101 changes: 14 additions & 87 deletions include/tcframe/generator/GeneratorLogger.hpp
Original file line number Diff line number Diff line change
@@ -1,107 +1,34 @@
#pragma once

#include <cstring>
#include <iostream>
#include <string>
#include <vector>

#include "tcframe/logger.hpp"
#include "tcframe/spec/constraint.hpp"
#include "tcframe/util.hpp"
#include "tcframe/verifier.hpp"

using std::string;
using std::vector;

namespace tcframe {

class GeneratorLogger : public BaseLogger {
class GeneratorLogger : public virtual BaseLogger {
public:
virtual ~GeneratorLogger() {}

GeneratorLogger(LoggerEngine* engine)
: BaseLogger(engine) {}

virtual void logIntroduction() {
engine_->logParagraph(0, "Generating test cases...");
}

virtual void logSuccessfulResult() {
engine_->logParagraph(0, "");
engine_->logParagraph(0, "Generation finished. All test cases OK.");
}

virtual void logFailedResult() {
engine_->logParagraph(0, "");
engine_->logParagraph(0, "Generation finished. Some test cases FAILED.");
}

virtual void logTestCaseSuccessfulResult() {
engine_->logParagraph(0, "OK");
}

virtual void logTestCaseFailedResult(const optional<string>& testCaseDescription) {
engine_->logParagraph(0, "FAILED");
if (testCaseDescription) {
engine_->logParagraph(2, "Description: " + testCaseDescription.value());
}
engine_->logParagraph(2, "Reasons:");
}

virtual void logMultipleTestCasesCombinationIntroduction(const string& testGroupName) {
engine_->logHangingParagraph(1, "Combining test cases into a single file (" + testGroupName + "): ");
}

virtual void logMultipleTestCasesCombinationSuccessfulResult() {
engine_->logParagraph(0, "OK");
}

virtual void logMultipleTestCasesCombinationFailedResult() {
engine_->logParagraph(0, "FAILED");
engine_->logParagraph(2, "Reasons:");
}

virtual void logConstraintsVerificationFailure(const ConstraintsVerificationResult& result) {
for (const auto& entry : result.unsatisfiedConstraintDescriptionsBySubtaskId()) {
int subtaskId = entry.first;
const vector<string>& unsatisfiedConstraintDescriptions = entry.second;

if (subtaskId == Subtask::MAIN_ID) {
engine_->logListItem1(2, "Does not satisfy constraints, on:");
} else {
engine_->logListItem1(2, "Does not satisfy subtask " + StringUtils::toString(subtaskId) + ", on constraints:");
}

for (const string& unsatisfiedConstraintDescription : unsatisfiedConstraintDescriptions) {
engine_->logListItem2(3, unsatisfiedConstraintDescription);
}
}
for (int subtaskId : result.satisfiedButNotAssignedSubtaskIds()) {
engine_->logListItem1(2, "Satisfies subtask " + StringUtils::toString(subtaskId) + " but is not assigned to it");
}
}

virtual void logIntroduction() = 0;
virtual void logSuccessfulResult() = 0;
virtual void logFailedResult() = 0;
virtual void logTestCaseSuccessfulResult() = 0;
virtual void logTestCaseFailedResult(const optional<string>& testCaseDescription) = 0;
virtual void logMultipleTestCasesCombinationIntroduction(const string& testGroupName) = 0;
virtual void logMultipleTestCasesCombinationSuccessfulResult() = 0;
virtual void logMultipleTestCasesCombinationFailedResult() = 0;
virtual void logConstraintsVerificationFailure(const ConstraintsVerificationResult& result) = 0;
virtual void logMultipleTestCasesConstraintsVerificationFailure(
const MultipleTestCasesConstraintsVerificationResult& result) {

engine_->logListItem1(2, "Does not satisfy constraints, on:");

for (const string& unsatisfiedConstraintDescription : result.unsatisfiedConstraintDescriptions()) {
engine_->logListItem2(3, unsatisfiedConstraintDescription);
}
}

virtual void logSampleTestCaseCheckFailure() {
engine_->logListItem1(2, "Sample test case output does not match with actual output produced by the solution");
}

virtual void logSampleTestCaseNoOutputNeededFailure() {
engine_->logListItem1(2, "Problem does not need test case outputs, but this sample test case has output");
}

virtual void logSimpleFailure(const string& message) {
engine_->logListItem1(2, message);
}
const MultipleTestCasesConstraintsVerificationResult& result) = 0;
virtual void logSampleTestCaseCheckFailure() = 0;
virtual void logSampleTestCaseNoOutputNeededFailure() = 0;
virtual void logSimpleFailure(const string& message) = 0;
};

}
1 change: 1 addition & 0 deletions include/tcframe/grader.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include "tcframe/grader/DefaultGraderLogger.hpp"
#include "tcframe/grader/Grader.hpp"
#include "tcframe/grader/GraderLogger.hpp"
#include "tcframe/grader/GradingOptions.hpp"
Expand Down
44 changes: 44 additions & 0 deletions include/tcframe/grader/DefaultGraderLogger.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#pragma once

#include <map>

#include "GraderLogger.hpp"
#include "tcframe/logger.hpp"
#include "tcframe/util.hpp"
#include "tcframe/verdict.hpp"

using std::map;

namespace tcframe {

class DefaultGraderLogger : public GraderLogger, public DefaultBaseLogger {
public:
virtual ~DefaultGraderLogger() {}

DefaultGraderLogger(LoggerEngine* engine)
: DefaultBaseLogger(engine) {}

virtual void logIntroduction(const string& solutionCommand) {
engine_->logParagraph(0, "Local grading with solution command: '" + solutionCommand + "'...");
}

virtual void logTestCaseVerdict(const Verdict& verdict) {
engine_->logParagraph(0, verdict.toString());
}

virtual void logResult(const map<int, Verdict>& subtaskVerdicts, const Verdict& verdict) {
if (subtaskVerdicts.size() > 1) {
engine_->logHeading("SUBTASK VERDICTS");
for (auto entry : subtaskVerdicts) {
engine_->logParagraph(
1,
"Subtask " + StringUtils::toString(entry.first) + ": " + entry.second.toString());
}
}

engine_->logHeading("VERDICT");
engine_->logParagraph(1, verdict.toString());
}
};

}
30 changes: 4 additions & 26 deletions include/tcframe/grader/GraderLogger.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,42 +3,20 @@
#include <map>

#include "tcframe/logger.hpp"
#include "tcframe/spec/constraint.hpp"
#include "tcframe/util.hpp"
#include "tcframe/verdict.hpp"

using std::map;

namespace tcframe {

class GraderLogger : public BaseLogger {
class GraderLogger : public virtual BaseLogger {
public:
virtual ~GraderLogger() {}

GraderLogger(LoggerEngine* engine)
: BaseLogger(engine) {}

virtual void logIntroduction(const string& solutionCommand) {
engine_->logParagraph(0, "Local grading with solution command: '" + solutionCommand + "'...");
}

virtual void logTestCaseVerdict(const Verdict& verdict) {
engine_->logParagraph(0, verdict.toString());
}

virtual void logResult(const map<int, Verdict>& subtaskVerdicts, const Verdict& verdict) {
if (subtaskVerdicts.size() > 1) {
engine_->logHeading("SUBTASK VERDICTS");
for (auto entry : subtaskVerdicts) {
engine_->logParagraph(
1,
"Subtask " + StringUtils::toString(entry.first) + ": " + entry.second.toString());
}
}

engine_->logHeading("VERDICT");
engine_->logParagraph(1, verdict.toString());
}
virtual void logIntroduction(const string& solutionCommand) = 0;
virtual void logTestCaseVerdict(const Verdict& verdict) = 0;
virtual void logResult(const map<int, Verdict>& subtaskVerdicts, const Verdict& verdict) = 0;
};

}
1 change: 1 addition & 0 deletions include/tcframe/logger.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include "tcframe/logger/BaseLogger.hpp"
#include "tcframe/logger/DefaultBaseLogger.hpp"
#include "tcframe/logger/LoggerEngine.hpp"
#include "tcframe/logger/SimpleLoggerEngine.hpp"

0 comments on commit d56377f

Please sign in to comment.