From 6cc7e7f1240a8f97e1472d12269fee69a8f3e665 Mon Sep 17 00:00:00 2001 From: Shuming Date: Thu, 21 Mar 2019 23:06:50 +0800 Subject: [PATCH 01/18] Modified autograding_errors to autograding_summary --- ..._alter_answers_table_autograding_errors.exs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 priv/repo/migrations/20190318070229_alter_answers_table_autograding_errors.exs diff --git a/priv/repo/migrations/20190318070229_alter_answers_table_autograding_errors.exs b/priv/repo/migrations/20190318070229_alter_answers_table_autograding_errors.exs new file mode 100644 index 000000000..ee7563a56 --- /dev/null +++ b/priv/repo/migrations/20190318070229_alter_answers_table_autograding_errors.exs @@ -0,0 +1,18 @@ +defmodule Cadet.Repo.Migrations.AlterAnswersTableAutogradingErrors do + use Ecto.Migration + + def up do + alter table(:answers) do + add(:autograding_summary, :map) + remove(:autograding_errors) + end + + end + + def down do + alter table(:answers) do + remove(:autograding_summary) + add(:autograding_errors, {:array, :map}) + end + end +end From 6d906ba3e73a58dbc65f41d8a5576767c89f96bf Mon Sep 17 00:00:00 2001 From: Shuming Date: Wed, 27 Mar 2019 14:52:29 +0800 Subject: [PATCH 02/18] integrate autograder and new xml format --- lib/cadet/assessments/answer.ex | 4 +- .../question_types/programming_question.ex | 15 ++- .../programming_question_testcases.ex | 22 ++++ lib/cadet/jobs/autograder/lambda_worker.ex | 73 ++++++----- .../jobs/autograder/result_store_worker.ex | 2 +- lib/cadet/jobs/xml_parser.ex | 34 +++-- .../controllers/assessments_controller.ex | 43 ++++++- lib/cadet_web/views/assessments_view.ex | 56 ++++++++- ...alter_answers_table_autograding_errors.exs | 15 +-- test/cadet/assessments/assessments_test.exs | 4 +- test/cadet/assessments/question_test.exs | 4 +- .../programming_question_test.exs | 10 +- .../programming_question_testcases_test.exs | 37 ++++++ .../jobs/autograder/lambda_worker_test.exs | 117 ++++++++++++------ .../autograder/result_store_worker_test.exs | 36 ++++-- test/cadet/updater/xml_parser_test.exs | 18 ++- .../assessments_controller_test.exs | 13 +- .../controllers/grading_controller_test.exs | 33 ++++- .../factories/assessments/question_factory.ex | 22 +++- .../custom_cassettes/autograder/errors#1.json | 4 +- .../custom_cassettes/autograder/errors#2.json | 4 +- .../autograder/success#1.json | 4 +- test/support/xml_generator.ex | 55 ++++++-- 23 files changed, 482 insertions(+), 143 deletions(-) create mode 100644 lib/cadet/assessments/question_types/programming_question_testcases.ex create mode 100644 test/cadet/assessments/question_types/programming_question_testcases_test.exs diff --git a/lib/cadet/assessments/answer.ex b/lib/cadet/assessments/answer.ex index e5e9d75b9..65f76a965 100644 --- a/lib/cadet/assessments/answer.ex +++ b/lib/cadet/assessments/answer.ex @@ -17,7 +17,7 @@ defmodule Cadet.Assessments.Answer do field(:xp, :integer, default: 0) field(:xp_adjustment, :integer, default: 0) field(:autograding_status, AutogradingStatus, default: :none) - field(:autograding_errors, {:array, :map}, default: []) + field(:autograding_results, {:array, :map}, default: []) field(:answer, :map) field(:type, QuestionType, virtual: true) field(:comment, :string) @@ -56,7 +56,7 @@ defmodule Cadet.Assessments.Answer do @spec autograding_changeset(%__MODULE__{} | Ecto.Changeset.t(), map()) :: Ecto.Changeset.t() def autograding_changeset(answer, params) do answer - |> cast(params, ~w(grade adjustment xp autograding_status autograding_errors)a) + |> cast(params, ~w(grade adjustment xp autograding_status autograding_results)a) |> validate_xp_grade_adjustment_total() end diff --git a/lib/cadet/assessments/question_types/programming_question.ex b/lib/cadet/assessments/question_types/programming_question.ex index 806831af3..168950d33 100644 --- a/lib/cadet/assessments/question_types/programming_question.ex +++ b/lib/cadet/assessments/question_types/programming_question.ex @@ -4,20 +4,27 @@ defmodule Cadet.Assessments.QuestionTypes.ProgrammingQuestion do """ use Cadet, :model + alias Cadet.Assessments.QuestionTypes.Testcase + @primary_key false embedded_schema do field(:content, :string) - field(:solution_template, :string) + field(:prepend, :string, default: "") + field(:template, :string) + field(:postpend, :string, default: "") field(:solution, :string) - field(:autograder, {:array, :string}) + embeds_many(:public, Testcase) + embeds_many(:private, Testcase) end - @required_fields ~w(content solution_template)a - @optional_fields ~w(solution autograder)a + @required_fields ~w(content template)a + @optional_fields ~w(solution prepend postpend)a def changeset(question, params \\ %{}) do question |> cast(params, @required_fields ++ @optional_fields) + |> cast_embed(:public, with: &Testcase.changeset/2) + |> cast_embed(:private, with: &Testcase.changeset/2) |> validate_required(@required_fields) end end diff --git a/lib/cadet/assessments/question_types/programming_question_testcases.ex b/lib/cadet/assessments/question_types/programming_question_testcases.ex new file mode 100644 index 000000000..5aa940d95 --- /dev/null +++ b/lib/cadet/assessments/question_types/programming_question_testcases.ex @@ -0,0 +1,22 @@ +defmodule Cadet.Assessments.QuestionTypes.Testcase do + @moduledoc """ + The Assessments.QuestionTypes.Testcase entity represents a public/private testcase. + """ + use Cadet, :model + + @primary_key false + embedded_schema do + field(:program, :string) + field(:answer, :string) + field(:score, :integer) + end + + @required_fields ~w(program answer score)a + + def changeset(question, params \\ %{}) do + question + |> cast(params, @required_fields) + |> validate_required([:program, :answer]) + |> validate_number(:score, greater_than_or_equal_to: 0) + end +end diff --git a/lib/cadet/jobs/autograder/lambda_worker.ex b/lib/cadet/jobs/autograder/lambda_worker.ex index 18b468b30..94d9c6fc0 100644 --- a/lib/cadet/jobs/autograder/lambda_worker.ex +++ b/lib/cadet/jobs/autograder/lambda_worker.ex @@ -20,6 +20,9 @@ defmodule Cadet.Autograder.LambdaWorker do def perform(params = %{answer: answer = %Answer{}, question: %Question{}}) do lambda_params = build_request_params(params) + # params |> IO.inspect() + # lambda_params |> IO.inspect() + response = @lambda_name |> ExAws.Lambda.invoke(lambda_params, %{}) @@ -27,16 +30,12 @@ defmodule Cadet.Autograder.LambdaWorker do # If the lambda crashes, results are in the format of: # %{"errorMessage" => "${message}"} - if is_map(response) do - raise inspect(response) - else - result = - response - |> parse_response(lambda_params) - |> Map.put(:status, :success) + result = + response + |> parse_response() + |> Map.put(:status, :success) - Que.add(ResultStoreWorker, %{answer_id: answer.id, result: result}) - end + Que.add(ResultStoreWorker, %{answer_id: answer.id, result: result}) end def on_failure(%{answer: answer = %Answer{}, question: %Question{}}, error) do @@ -55,8 +54,17 @@ defmodule Cadet.Autograder.LambdaWorker do result: %{ grade: 0, status: :failed, - errors: [ - %{"systemError" => "Autograder runtime error. Please contact a system administrator"} + result: [ + %{ + "resultType" => "error", + "errors" => [ + %{ + "errorType" => "systemError", + "errorMessage" => + "Autograder runtime error. Please contact a system administrator" + } + ] + } ] } } @@ -65,6 +73,7 @@ defmodule Cadet.Autograder.LambdaWorker do def build_request_params(%{question: question = %Question{}, answer: answer = %Answer{}}) do question_content = question.question + # |> IO.inspect() {_, upcased_name_external} = question.grading_library.external @@ -75,8 +84,11 @@ defmodule Cadet.Autograder.LambdaWorker do ) %{ - graderPrograms: question_content["autograder"], - studentProgram: answer.answer["code"], + prependProgram: Map.get(question_content, "prepend", ""), + studentProgram: Map.get(answer.answer, "code"), + postpendProgram: Map.get(question_content, "postpend", ""), + testcases: + Map.get(question_content, "public", []) ++ Map.get(question_content, "private", []), library: %{ chapter: question.grading_library.chapter, external: upcased_name_external, @@ -85,23 +97,24 @@ defmodule Cadet.Autograder.LambdaWorker do } end - def parse_response(response, %{graderPrograms: grader_programs}) do - response - |> Enum.zip(grader_programs) - |> Enum.reduce( - %{grade: 0, errors: []}, - fn {result, grader_program}, %{grade: grade, errors: errors} -> - if result["resultType"] == "pass" do - %{grade: grade + result["grade"], errors: errors} - else - error_result = %{ - grader_program: grader_program, - errors: result["errors"] + def parse_response(response) do + if Map.has_key?(response, "errorMessage") do + %{ + grade: 0, + status: :failed, + result: [ + %{ + "resultType" => "error", + "errors" => [ + %{"errorType" => "systemError", "errorMessage" => response["errorMessage"]} + ] } - - %{grade: grade, errors: errors ++ [error_result]} - end - end - ) + ] + } + else + %{grade: response["totalScore"], result: response["results"], status: :success} + end end end + +# ############# EDIT CASSETTE ############# diff --git a/lib/cadet/jobs/autograder/result_store_worker.ex b/lib/cadet/jobs/autograder/result_store_worker.ex index a4bf7328f..e65e4df93 100644 --- a/lib/cadet/jobs/autograder/result_store_worker.ex +++ b/lib/cadet/jobs/autograder/result_store_worker.ex @@ -61,7 +61,7 @@ defmodule Cadet.Autograder.ResultStoreWorker do grade: result.grade, xp: xp, autograding_status: status, - autograding_errors: result.errors + autograding_results: result.result } answer diff --git a/lib/cadet/jobs/xml_parser.ex b/lib/cadet/jobs/xml_parser.ex index 524a1a318..bcb4f6bbd 100644 --- a/lib/cadet/jobs/xml_parser.ex +++ b/lib/cadet/jobs/xml_parser.ex @@ -247,15 +247,31 @@ defmodule Cadet.Updater.XMLParser do end defp process_question_entity_by_type(entity, "programming") do - entity - |> xpath( - ~x"."e, - content: ~x"./TEXT/text()" |> transform_by(&process_charlist/1), - solution_template: ~x"./SNIPPET/TEMPLATE/text()" |> transform_by(&process_charlist/1), - solution: ~x"./SNIPPET/SOLUTION/text()" |> transform_by(&process_charlist/1), - autograder: - ~x"./SNIPPET/GRADER/text()"l - |> transform_by(&Enum.map(&1, fn charlist -> process_charlist(charlist) end)) + Map.merge( + entity + |> xpath( + ~x"."e, + content: ~x"./TEXT/text()" |> transform_by(&process_charlist/1), + prepend: ~x"./SNIPPET/PREPEND/text()" |> transform_by(&process_charlist/1), + template: ~x"./SNIPPET/TEMPLATE/text()" |> transform_by(&process_charlist/1), + postpend: ~x"./SNIPPET/POSTPEND/text()" |> transform_by(&process_charlist/1), + solution: ~x"./SNIPPET/SOLUTION/text()" |> transform_by(&process_charlist/1) + ), + entity + |> xmap( + public: [ + ~x"./SNIPPET/TESTCASES/PUBLIC"l, + score: ~x"./@score"oi, + answer: ~x"./@answer" |> transform_by(&process_charlist/1), + program: ~x"./text()" |> transform_by(&process_charlist/1) + ], + private: [ + ~x"./SNIPPET/TESTCASES/PRIVATE"l, + score: ~x"./@score"oi, + answer: ~x"./@answer" |> transform_by(&process_charlist/1), + program: ~x"./text()" |> transform_by(&process_charlist/1) + ] + ) ) end diff --git a/lib/cadet_web/controllers/assessments_controller.ex b/lib/cadet_web/controllers/assessments_controller.ex index a605a5a54..31306d0da 100644 --- a/lib/cadet_web/controllers/assessments_controller.ex +++ b/lib/cadet_web/controllers/assessments_controller.ex @@ -193,9 +193,22 @@ defmodule CadetWeb.AssessmentsController do "The library used for this question" ) - solutionTemplate(:string, "Solution template for programming questions") + prepend(:string, "Prepend program for programming questions") + + template(:string, "Solution template for programming questions") + + postpend(:string, "Postpend program for programming questions") + + testcases( + Schema.new do + type(:array) + items(Schema.ref(:Testcase)) + end, + "Testcase programs for programming questions" + ) grader(Schema.ref(:GraderInfo)) + gradedAt(:string, "Last graded at", format: "date-time", required: false) xp(:integer, "Final XP given to this question. Only provided for students.") @@ -212,6 +225,18 @@ defmodule CadetWeb.AssessmentsController do "The max xp for this question", required: true ) + + autogradingStatus( + :string, + "One of none/processing/success/failed" + ) + + autogradingResults( + Schema.new do + type(:array) + items(Schema.ref(:AutogradingResult)) + end + ) end end, MCQChoice: @@ -261,6 +286,22 @@ defmodule CadetWeb.AssessmentsController do "The external library for this question" ) end + end, + Testcase: + swagger_schema do + properties do + answer(:string) + score(:integer) + program(:string) + end + end, + AutogradingResult: + swagger_schema do + properties do + resultType(:string, "One of pass/fail/error") + expected(:string) + actual(:string) + end end } end diff --git a/lib/cadet_web/views/assessments_view.ex b/lib/cadet_web/views/assessments_view.ex index 3352f8737..7eef42e0b 100644 --- a/lib/cadet_web/views/assessments_view.ex +++ b/lib/cadet_web/views/assessments_view.ex @@ -128,11 +128,49 @@ defmodule CadetWeb.AssessmentsView do grader: grader_builder(grader), gradedAt: graded_at_builder(grader), xp: &((&1.xp || 0) + (&1.xp_adjustment || 0)), - grade: &((&1.grade || 0) + (&1.adjustment || 0)) + grade: &((&1.grade || 0) + (&1.adjustment || 0)), + autogradingStatus: :autograding_status, + autogradingResults: build_results(%{results: answer.autograding_results}) }) end - def build_choice(%{choice: choice}) do + defp build_results(%{results: results}) do + if !is_nil(results) do + &Enum.map(&1.autograding_results, fn result -> build_result(%{result: result}) end) + else + results + end + end + + defp build_result(%{result: result}) do + transform_map_for_view(result, %{ + resultType: "resultType", + expected: "expected", + actual: "actual", + errorType: "errorType", + errors: build_errors(%{errors: result["errors"]}) + }) + end + + defp build_errors(%{errors: errors}) do + if !is_nil(errors) do + &Enum.map(&1["errors"], fn error -> build_error(%{error: error}) end) + else + errors + end + end + + defp build_error(%{error: error}) do + transform_map_for_view(error, %{ + errorType: "errorType", + line: "line", + location: "location", + errorLine: "errorLine", + errorExplanation: "errorExplanation" + }) + end + + defp build_choice(%{choice: choice}) do transform_map_for_view(choice, %{ id: "choice_id", content: "content", @@ -140,12 +178,24 @@ defmodule CadetWeb.AssessmentsView do }) end + defp build_testcase(%{testcase: testcase}) do + transform_map_for_view(testcase, %{ + answer: "answer", + score: "score", + program: "program" + }) + end + defp build_question_content_by_type(%{question: %{question: question, type: question_type}}) do case question_type do :programming -> transform_map_for_view(question, %{ content: "content", - solutionTemplate: "solution_template" + prepend: "prepend", + template: "template", + postpend: "postpend", + testcases: + &Enum.map(&1["public"], fn testcase -> build_testcase(%{testcase: testcase}) end) }) :mcq -> diff --git a/priv/repo/migrations/20190318070229_alter_answers_table_autograding_errors.exs b/priv/repo/migrations/20190318070229_alter_answers_table_autograding_errors.exs index ee7563a56..f07d7d7a9 100644 --- a/priv/repo/migrations/20190318070229_alter_answers_table_autograding_errors.exs +++ b/priv/repo/migrations/20190318070229_alter_answers_table_autograding_errors.exs @@ -1,18 +1,7 @@ defmodule Cadet.Repo.Migrations.AlterAnswersTableAutogradingErrors do use Ecto.Migration - def up do - alter table(:answers) do - add(:autograding_summary, :map) - remove(:autograding_errors) - end - - end - - def down do - alter table(:answers) do - remove(:autograding_summary) - add(:autograding_errors, {:array, :map}) - end + def change do + rename(table(:answers), :autograding_errors, to: :autograding_results) end end diff --git a/test/cadet/assessments/assessments_test.exs b/test/cadet/assessments/assessments_test.exs index ade71ebb4..e6e406b3e 100644 --- a/test/cadet/assessments/assessments_test.exs +++ b/test/cadet/assessments/assessments_test.exs @@ -32,7 +32,9 @@ defmodule Cadet.AssessmentsTest do library: build(:library), question: %{ content: Faker.Pokemon.name(), - solution_template: Faker.Lorem.Shakespeare.as_you_like_it(), + prepend: "", + template: Faker.Lorem.Shakespeare.as_you_like_it(), + postpend: "", solution: Faker.Lorem.Shakespeare.hamlet() } }, diff --git a/test/cadet/assessments/question_test.exs b/test/cadet/assessments/question_test.exs index d157abfbd..3f1e5e7d8 100644 --- a/test/cadet/assessments/question_test.exs +++ b/test/cadet/assessments/question_test.exs @@ -15,7 +15,9 @@ defmodule Cadet.Assessments.QuestionTest do library: build(:library), question: %{ content: Faker.Pokemon.name(), - solution_template: Faker.Lorem.Shakespeare.as_you_like_it(), + prepend: "", + template: Faker.Lorem.Shakespeare.as_you_like_it(), + postpend: "", solution: Faker.Lorem.Shakespeare.hamlet() } } diff --git a/test/cadet/assessments/question_types/programming_question_test.exs b/test/cadet/assessments/question_types/programming_question_test.exs index cf860b8d8..77f187bdc 100644 --- a/test/cadet/assessments/question_types/programming_question_test.exs +++ b/test/cadet/assessments/question_types/programming_question_test.exs @@ -8,14 +8,20 @@ defmodule Cadet.Assessments.QuestionTypes.ProgrammingQuestionTest do assert_changeset( %{ content: "asd", - solution_template: "asd" + template: "asd" }, :valid ) end test "invalid changesets" do - assert_changeset(%{content: "asd"}, :invalid) + assert_changeset( + %{ + content: 1, + template: "asd" + }, + :invalid + ) assert_changeset( %{ diff --git a/test/cadet/assessments/question_types/programming_question_testcases_test.exs b/test/cadet/assessments/question_types/programming_question_testcases_test.exs new file mode 100644 index 000000000..60ad9b275 --- /dev/null +++ b/test/cadet/assessments/question_types/programming_question_testcases_test.exs @@ -0,0 +1,37 @@ +defmodule Cadet.Assessments.QuestionTypes.ProgrammingQuestionTestcaseTest do + alias Cadet.Assessments.QuestionTypes.Testcase + + use Cadet.ChangesetCase, entity: Testcase + + describe "Changesets" do + test "valid changeset" do + assert_changeset( + %{ + score: 1, + answer: "asd", + program: "asd" + }, + :valid + ) + end + + test "invalid changesets" do + assert_changeset( + %{ + score: -1, + answer: "asd", + program: "asd" + }, + :invalid + ) + + assert_changeset( + %{ + score: 1, + answer: "asd" + }, + :invalid + ) + end + end +end diff --git a/test/cadet/jobs/autograder/lambda_worker_test.exs b/test/cadet/jobs/autograder/lambda_worker_test.exs index 7acfaadfe..eeca1269d 100644 --- a/test/cadet/jobs/autograder/lambda_worker_test.exs +++ b/test/cadet/jobs/autograder/lambda_worker_test.exs @@ -20,9 +20,11 @@ defmodule Cadet.Autograder.LambdaWorkerTest do %{ question: build(:programming_question_content, %{ - autograder: [ - "function ek0chei0y1() {\n return f(0) === 0 ? 1 : 0;\n }\n\n ek0chei0y1();", - "function ek0chei0y1() {\n const test1 = f(7) === 13;\n const test2 = f(10) === 55;\n const test3 = f(12) === 144;\n return test1 && test2 && test3 ? 4 : 0;\n }\n\n ek0chei0y1();" + public: [ + %{"score" => 1, "answer" => "1", "program" => "f(1);"} + ], + private: [ + %{"score" => 1, "answer" => "45", "program" => "f(10);"} ] }) } @@ -56,7 +58,14 @@ defmodule Cadet.Autograder.LambdaWorkerTest do assert_called( Que.add(ResultStoreWorker, %{ answer_id: answer.id, - result: %{errors: [], grade: 5, status: :success} + result: %{ + result: [ + %{"resultType" => "pass", "score" => 1}, + %{"resultType" => "pass", "score" => 1} + ], + grade: 2, + status: :success + } }) ) end @@ -75,16 +84,32 @@ defmodule Cadet.Autograder.LambdaWorkerTest do Que.add(ResultStoreWorker, %{ answer_id: answer.id, result: %{ - errors: [ + result: [ %{ - errors: [%{"errorType" => "syntax", "line" => 1, "location" => "student"}], - grader_program: - "function ek0chei0y1() {\n return f(0) === 0 ? 1 : 0;\n }\n\n ek0chei0y1();" + "resultType" => "error", + "errors" => [ + %{ + "errorType" => "syntax", + "line" => 1, + "location" => "student", + "errorLine" => + "consst f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);", + "errorExplanation" => "SyntaxError: Unexpected token (2:7)" + } + ] }, %{ - errors: [%{"errorType" => "syntax", "line" => 1, "location" => "student"}], - grader_program: - "function ek0chei0y1() {\n const test1 = f(7) === 13;\n const test2 = f(10) === 55;\n const test3 = f(12) === 144;\n return test1 && test2 && test3 ? 4 : 0;\n }\n\n ek0chei0y1();" + "resultType" => "error", + "errors" => [ + %{ + "errorType" => "syntax", + "line" => 1, + "location" => "student", + "errorLine" => + "consst f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);", + "errorExplanation" => "SyntaxError: Unexpected token (2:7)" + } + ] } ], grade: 0, @@ -96,24 +121,25 @@ defmodule Cadet.Autograder.LambdaWorkerTest do end end - test "lambda errors", %{question: question, answer: answer} do - error_response = %{"errorMessage" => "Some error message"} + # test "lambda errors", %{question: question, answer: answer} do + # error_response = %{"errorMessage" => "Some error message"} - with_mock ExAws, request!: fn _ -> error_response end do - expected_error = inspect(error_response) + # with_mock ExAws, request!: fn _ -> error_response end do + # expected_error = inspect(error_response) - assert_raise RuntimeError, expected_error, fn -> - LambdaWorker.perform(%{ - question: Repo.get(Question, question.id), - answer: Repo.get(Answer, answer.id) - }) - end - end - end + # assert_raise RuntimeError, expected_error, fn -> + # LambdaWorker.perform(%{ + # question: Repo.get(Question, question.id), + # answer: Repo.get(Answer, answer.id) + # }) + # end + # end + # end end describe "on_failure" do test "it stores error message", %{question: question, answer: answer} do + # question |> IO.inspect() with_mock Que, add: fn _, _ -> nil end do error = %{"errorMessage" => "Task timed out after 1.00 seconds"} @@ -130,19 +156,28 @@ defmodule Cadet.Autograder.LambdaWorkerTest do assert log =~ "Task timed out after 1.00 seconds" assert_called( - Que.add(ResultStoreWorker, %{ - answer_id: answer.id, - result: %{ - errors: [ - %{ - "systemError" => - "Autograder runtime error. Please contact a system administrator" - } - ], - grade: 0, - status: :failed + Que.add( + ResultStoreWorker, + %{ + answer_id: answer.id, + result: %{ + grade: 0, + status: :failed, + result: [ + %{ + "resultType" => "error", + "errors" => [ + %{ + "errorType" => "systemError", + "errorMessage" => + "Autograder runtime error. Please contact a system administrator" + } + ] + } + ] + } } - }) + ) ) end end @@ -150,9 +185,12 @@ defmodule Cadet.Autograder.LambdaWorkerTest do describe "#build_request_params" do test "it should build correct params", %{question: question, answer: answer} do + # question |> IO.inspect() expected = %{ - graderPrograms: question.question["autograder"], - studentProgram: answer.answer["code"], + prependProgram: question.question.prepend, + postpendProgram: question.question.postpend, + testcases: question.question.public ++ question.question.private, + studentProgram: answer.answer.code, library: %{ chapter: question.grading_library.chapter, external: %{ @@ -163,7 +201,10 @@ defmodule Cadet.Autograder.LambdaWorkerTest do } } - assert LambdaWorker.build_request_params(%{question: question, answer: answer}) == expected + assert LambdaWorker.build_request_params(%{ + question: Repo.get(Question, question.id), + answer: Repo.get(Answer, answer.id) + }) == expected end end end diff --git a/test/cadet/jobs/autograder/result_store_worker_test.exs b/test/cadet/jobs/autograder/result_store_worker_test.exs index b8a84b517..3c7717f1e 100644 --- a/test/cadet/jobs/autograder/result_store_worker_test.exs +++ b/test/cadet/jobs/autograder/result_store_worker_test.exs @@ -8,19 +8,33 @@ defmodule Cadet.Autograder.ResultStoreWorkerTest do setup do answer = insert(:answer, %{question: insert(:question), submission: insert(:submission)}) - success_no_errors = %{status: :success, grade: 10, errors: []} + success_no_errors = %{status: :success, grade: 10, result: []} success_with_errors = %{ - errors: [ + result: [ %{ - errors: [%{"errorType" => "syntax", "line" => 1, "location" => "student"}], - grader_program: - "function ek0chei0y1() {\n return f(0) === 0 ? 1 : 0;\n }\n\n ek0chei0y1();" + "resultType" => "error", + "errors" => [ + %{ + "errorType" => "syntax", + "line" => 1, + "location" => "student", + "errorLine" => "consst f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);", + "errorExplanation" => "SyntaxError: Unexpected token (2:7)" + } + ] }, %{ - errors: [%{"errorType" => "syntax", "line" => 1, "location" => "student"}], - grader_program: - "function ek0chei0y1() {\n const test1 = f(7) === 13;\n const test2 = f(10) === 55;\n const test3 = f(12) === 144;\n return test1 && test2 && test3 ? 4 : 0;\n }\n\n ek0chei0y1();" + "resultType" => "error", + "errors" => [ + %{ + "errorType" => "syntax", + "line" => 1, + "location" => "student", + "errorLine" => "consst f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);", + "errorExplanation" => "SyntaxError: Unexpected token (2:7)" + } + ] } ], grade: 0, @@ -28,7 +42,7 @@ defmodule Cadet.Autograder.ResultStoreWorkerTest do } failed = %{ - errors: [ + result: [ %{ "systemError" => "Autograder runtime error. Please contact a system administrator" } @@ -63,7 +77,7 @@ defmodule Cadet.Autograder.ResultStoreWorkerTest do |> Repo.get(answer.id) errors_string_keys = - Enum.map(result.errors, fn err -> + Enum.map(result.result, fn err -> Enum.reduce(err, %{}, fn {k, v}, acc -> Map.put(acc, "#{k}", v) end) @@ -83,7 +97,7 @@ defmodule Cadet.Autograder.ResultStoreWorkerTest do end assert answer.autograding_status == result.status - assert answer.autograding_errors == errors_string_keys + assert answer.autograding_results == errors_string_keys end end end diff --git a/test/cadet/updater/xml_parser_test.exs b/test/cadet/updater/xml_parser_test.exs index 15ce493b0..b625ec1a3 100644 --- a/test/cadet/updater/xml_parser_test.exs +++ b/test/cadet/updater/xml_parser_test.exs @@ -40,7 +40,7 @@ defmodule Cadet.Updater.XMLParserTest do test "XML Parser happy path", %{assessments: assessments, questions: questions} do for assessment <- assessments do xml = XMLGenerator.generate_xml_for(assessment, questions) - + # xml |> IO.inspect() assert XMLParser.parse_xml(xml) == :ok number = assessment.number @@ -66,6 +66,8 @@ defmodule Cadet.Updater.XMLParserTest do |> Repo.all() for {question, question_db} <- Enum.zip(questions, questions_db) do + # question |> IO.inspect() + # question_db |> IO.inspect() assert_map_keys( Map.from_struct(question_db), Map.from_struct(question), @@ -357,6 +359,20 @@ defmodule Cadet.Updater.XMLParserTest do defp stringify(string) when is_binary(string), do: string defp assert_map_keys(map1, map2, keys) when is_map(map1) and is_map(map2) do + # POSSIBLE ISSUE OF NIL KEYS NOT BEING ASSERTED PROPERLY? + + # "############ MAP 1 ############" + # |> IO.inspect + + # map1 + # |> IO.inspect + + # "############ MAP 2 ############" + # |> IO.inspect + + # map2 + # |> IO.inspect + for key <- keys do assert_error_message = "key: #{inspect(key)}, map1[key]: #{inspect(map1[key])}, map2[key]: #{inspect(map2[key])}" diff --git a/test/cadet_web/controllers/assessments_controller_test.exs b/test/cadet_web/controllers/assessments_controller_test.exs index ff54e122f..8b8636d27 100644 --- a/test/cadet_web/controllers/assessments_controller_test.exs +++ b/test/cadet_web/controllers/assessments_controller_test.exs @@ -248,7 +248,16 @@ defmodule CadetWeb.AssessmentsControllerTest do "id" => &1.id, "type" => "#{&1.type}", "content" => &1.question.content, - "solutionTemplate" => &1.question.solution_template + "template" => &1.question.template, + "prepend" => &1.question.prepend, + "postpend" => &1.question.postpend, + "testcases" => + Enum.map( + &1.question.public, + fn testcase -> + for {k, v} <- testcase, into: %{}, do: {Atom.to_string(k), v} + end + ) } ) @@ -291,6 +300,8 @@ defmodule CadetWeb.AssessmentsControllerTest do |> Enum.map(&Map.delete(&1, "maxGrade")) |> Enum.map(&Map.delete(&1, "grader")) |> Enum.map(&Map.delete(&1, "gradedAt")) + |> Enum.map(&Map.delete(&1, "autogradingResults")) + |> Enum.map(&Map.delete(&1, "autogradingStatus")) assert expected_questions == resp_questions end diff --git a/test/cadet_web/controllers/grading_controller_test.exs b/test/cadet_web/controllers/grading_controller_test.exs index 027f9322a..389f3667b 100644 --- a/test/cadet_web/controllers/grading_controller_test.exs +++ b/test/cadet_web/controllers/grading_controller_test.exs @@ -227,7 +227,16 @@ defmodule CadetWeb.GradingControllerTest do :programming -> %{ "question" => %{ - "solutionTemplate" => &1.question.question.solution_template, + "prepend" => &1.question.question.prepend, + "postpend" => &1.question.question.postpend, + "testcases" => + Enum.map( + &1.question.question.public, + fn testcase -> + for {k, v} <- testcase, into: %{}, do: {Atom.to_string(k), v} + end + ), + "template" => &1.question.question.template, "type" => "#{&1.question.type}", "id" => &1.question.id, "library" => %{ @@ -333,7 +342,16 @@ defmodule CadetWeb.GradingControllerTest do :programming -> %{ "question" => %{ - "solutionTemplate" => &1.question.question.solution_template, + "prepend" => &1.question.question.prepend, + "postpend" => &1.question.question.postpend, + "testcases" => + Enum.map( + &1.question.question.public, + fn testcase -> + for {k, v} <- testcase, into: %{}, do: {Atom.to_string(k), v} + end + ), + "template" => &1.question.question.template, "type" => "#{&1.question.type}", "id" => &1.question.id, "library" => %{ @@ -621,7 +639,16 @@ defmodule CadetWeb.GradingControllerTest do :programming -> %{ "question" => %{ - "solutionTemplate" => &1.question.question.solution_template, + "prepend" => &1.question.question.prepend, + "postpend" => &1.question.question.postpend, + "testcases" => + Enum.map( + &1.question.question.public, + fn testcase -> + for {k, v} <- testcase, into: %{}, do: {Atom.to_string(k), v} + end + ), + "template" => &1.question.question.template, "type" => "#{&1.question.type}", "id" => &1.question.id, "library" => %{ diff --git a/test/factories/assessments/question_factory.ex b/test/factories/assessments/question_factory.ex index ca8277f27..9ff7c2252 100644 --- a/test/factories/assessments/question_factory.ex +++ b/test/factories/assessments/question_factory.ex @@ -27,13 +27,25 @@ defmodule Cadet.Assessments.QuestionFactory do def programming_question_content_factory do %{ + prepend: Faker.Pokemon.location(), content: Faker.Pokemon.name(), - solution_template: Faker.Lorem.Shakespeare.as_you_like_it(), + postpend: Faker.Pokemon.location(), + template: Faker.Lorem.Shakespeare.as_you_like_it(), solution: Faker.Lorem.Shakespeare.hamlet(), - autograder: - (&Faker.Lorem.Shakespeare.king_richard_iii/0) - |> Stream.repeatedly() - |> Enum.take(Enum.random(0..2)) + public: [ + %{ + score: :rand.uniform(5), + answer: Faker.StarWars.character(), + program: Faker.Lorem.Shakespeare.king_richard_iii() + } + ], + private: [ + %{ + score: :rand.uniform(5), + answer: Faker.StarWars.character(), + program: Faker.Lorem.Shakespeare.king_richard_iii() + } + ] } end diff --git a/test/fixtures/custom_cassettes/autograder/errors#1.json b/test/fixtures/custom_cassettes/autograder/errors#1.json index c5b005e74..639ac9d49 100644 --- a/test/fixtures/custom_cassettes/autograder/errors#1.json +++ b/test/fixtures/custom_cassettes/autograder/errors#1.json @@ -2,7 +2,7 @@ { "request": { "body": - "{\"studentProgram\":\"consst f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);\",\"library\":{\"globals\":[],\"external\":{\"symbols\":[],\"name\":\"NONE\"},\"chapter\":3},\"graderPrograms\":[\"function ek0chei0y1() {\\n return f(0) === 0 ? 1 : 0;\\n }\\n\\n ek0chei0y1();\",\"function ek0chei0y1() {\\n const test1 = f(7) === 13;\\n const test2 = f(10) === 55;\\n const test3 = f(12) === 144;\\n return test1 && test2 && test3 ? 4 : 0;\\n }\\n\\n ek0chei0y1();\"]}", + "{\r\n \"library\": {\r\n \"chapter\": 2,\r\n \"external\": {\r\n \"name\": \"NONE\",\r\n \"symbols\": []\r\n },\r\n \"globals\": []\r\n },\r\n \"prependProgram\": \"\",\r\n \"studentProgram\": \"consst f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);\",\r\n \"postpendProgram\": \"\",\r\n \"testCases\": [\r\n {\r\n \"answer\": \"1\",\r\n \"program\": \"f(1);\",\r\n \"score\": 1\r\n },\r\n {\r\n \"answer\": \"55\",\r\n \"program\": \"f(10);\",\r\n \"score\": 1\r\n }\r\n ]\r\n}", "headers": { "Authorization": "hello_world", "host": "lambda.ap-southeast-1.amazonaws.com", @@ -21,7 +21,7 @@ "response": { "binary": false, "body": - "[{\"resultType\":\"error\",\"errors\":[{\"errorType\":\"syntax\",\"line\":1,\"location\":\"student\"}]},{\"resultType\":\"error\",\"errors\":[{\"errorType\":\"syntax\",\"line\":1,\"location\":\"student\"}]}]", + "{\r\n \"totalScore\": 0,\r\n \"results\": [\r\n {\r\n \"resultType\": \"error\",\r\n \"errors\": [\r\n {\r\n \"errorType\": \"syntax\",\r\n \"line\": 1,\r\n \"location\": \"student\",\r\n \"errorLine\": \"consst f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);\",\r\n \"errorExplanation\": \"SyntaxError: Unexpected token (2:7)\"\r\n }\r\n ]\r\n },\r\n {\r\n \"resultType\": \"error\",\r\n \"errors\": [\r\n {\r\n \"errorType\": \"syntax\",\r\n \"line\": 1,\r\n \"location\": \"student\",\r\n \"errorLine\": \"consst f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);\",\r\n \"errorExplanation\": \"SyntaxError: Unexpected token (2:7)\"\r\n }\r\n ]\r\n }\r\n ]\r\n}", "headers": { "Date": "Thu, 09 Aug 2018 09:53:29 GMT", "Content-Type": "application/json", diff --git a/test/fixtures/custom_cassettes/autograder/errors#2.json b/test/fixtures/custom_cassettes/autograder/errors#2.json index 5d65de1fe..2d40491f1 100644 --- a/test/fixtures/custom_cassettes/autograder/errors#2.json +++ b/test/fixtures/custom_cassettes/autograder/errors#2.json @@ -2,7 +2,7 @@ { "request": { "body": - "{\"studentProgram\":\"const f = i => f(i);\",\"library\":{\"globals\":[],\"external\":{\"symbols\":[],\"name\":\"NONE\"},\"chapter\":7},\"graderPrograms\":[\"function ek0chei0y1() {\\n return f(0) === 0 ? 1 : 0;\\n }\\n\\n ek0chei0y1();\",\"function ek0chei0y1() {\\n const test1 = f(7) === 13;\\n const test2 = f(10) === 55;\\n const test3 = f(12) === 144;\\n return test1 && test2 && test3 ? 4 : 0;\\n }\\n\\n ek0chei0y1();\"]}", + "{\r\n \"library\": {\r\n \"chapter\": 2,\r\n \"external\": {\r\n \"name\": \"NONE\",\r\n \"symbols\": []\r\n },\r\n \"globals\": []\r\n },\r\n \"prependProgram\": \"\",\r\n \"studentProgram\": \"const f = i => f(i);\",\r\n \"postpendProgram\": \"\",\r\n \"testCases\": [\r\n {\r\n \"answer\": \"1\",\r\n \"program\": \"f(1);\",\r\n \"score\": 1\r\n },\r\n {\r\n \"answer\": \"55\",\r\n \"program\": \"f(10);\",\r\n \"score\": 1\r\n }\r\n ]\r\n}", "headers": { "Authorization": "hello_world", "host": "lambda.ap-southeast-1.amazonaws.com", @@ -21,7 +21,7 @@ "response": { "binary": false, "body": - "{\"errorMessage\":\"2018-08-09T09:55:45.692Z 6049db71-33fa-4faa-88c4-38f57b6754f3 Task timed out after 1.00 seconds\"}", + "{\r\n \"totalScore\": 0,\r\n \"results\": [\r\n {\r\n \"resultType\": \"error\",\r\n \"errors\": [\r\n {\r\n \"errorType\": \"timeout\"\r\n }\r\n ]\r\n },\r\n {\r\n \"resultType\": \"error\",\r\n \"errors\": [\r\n {\r\n \"errorType\": \"timeout\"\r\n }\r\n ]\r\n }\r\n ]\r\n}", "headers": { "Date": "Thu, 09 Aug 2018 09:55:45 GMT", "Content-Type": "application/json", diff --git a/test/fixtures/custom_cassettes/autograder/success#1.json b/test/fixtures/custom_cassettes/autograder/success#1.json index b08c9aa53..68f3f6845 100644 --- a/test/fixtures/custom_cassettes/autograder/success#1.json +++ b/test/fixtures/custom_cassettes/autograder/success#1.json @@ -2,7 +2,7 @@ { "request": { "body": - "{\"studentProgram\":\"const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);\",\"library\":{\"globals\":[],\"external\":{\"symbols\":[],\"name\":\"NONE\"},\"chapter\":9},\"graderPrograms\":[\"function ek0chei0y1() {\\n return f(0) === 0 ? 1 : 0;\\n }\\n\\n ek0chei0y1();\",\"function ek0chei0y1() {\\n const test1 = f(7) === 13;\\n const test2 = f(10) === 55;\\n const test3 = f(12) === 144;\\n return test1 && test2 && test3 ? 4 : 0;\\n }\\n\\n ek0chei0y1();\"]}", + "{\r\n \"library\": {\r\n \"chapter\": 2,\r\n \"external\": {\r\n \"name\": \"NONE\",\r\n \"symbols\": []\r\n },\r\n \"globals\": []\r\n },\r\n \"prependProgram\": \"\",\r\n \"studentProgram\": \"const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);\",\r\n \"postpendProgram\": \"\",\r\n \"testCases\": [\r\n {\r\n \"answer\": \"1\",\r\n \"program\": \"f(1);\",\r\n \"score\": 1\r\n },\r\n {\r\n \"answer\": \"55\",\r\n \"program\": \"f(10);\",\r\n \"score\": 1\r\n }\r\n ]\r\n}", "headers": { "Authorization": "AWS4-HMAC-SHA256 Credential=AKIAIAHN5DV7RTRUVP6A/20180809/ap-southeast-1/lambda/aws4_request,SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date,Signature=5bb3b478cc5669bfd3a6188dd7a72590fd71b0f557673dec67b6b3bc81b3dd94", @@ -22,7 +22,7 @@ "response": { "binary": false, "body": - "[{\"resultType\":\"pass\",\"grade\":1},{\"resultType\":\"pass\",\"grade\":4}]", + "{\r\n \"totalScore\": 2,\r\n \"results\": [\r\n {\r\n \"resultType\": \"pass\",\r\n \"score\": 1\r\n },\r\n {\r\n \"resultType\": \"pass\",\r\n \"score\": 1\r\n }\r\n ]\r\n}", "headers": { "Date": "Thu, 09 Aug 2018 09:50:53 GMT", "Content-Type": "application/json", diff --git a/test/support/xml_generator.ex b/test/support/xml_generator.ex index 10bc92f86..aedcd6b24 100644 --- a/test/support/xml_generator.ex +++ b/test/support/xml_generator.ex @@ -108,7 +108,11 @@ defmodule Cadet.Test.XMLGenerator do end :programming -> - template_field = [template(question.question.solution_template)] + prepend_field = [prepend(question.question.prepend)] + + template_field = [template(question.question.template)] + + postpend_field = [postpend(question.question.postpend)] solution_field = if question.question[:solution] do @@ -117,14 +121,27 @@ defmodule Cadet.Test.XMLGenerator do [] end - grader_fields = - if question.question[:autograder] do - Enum.map(question.question[:autograder], &grader/1) - else - [] - end - - [snippet(template_field ++ solution_field ++ grader_fields)] + testcases_fields = [ + testcases( + [ + for testcase <- question.question[:public] do + public(%{score: testcase.score, answer: testcase.answer}, testcase.program) + end + ] ++ + [ + for testcase <- question.question[:private] do + private(%{score: testcase.score, answer: testcase.answer}, testcase.program) + end + ] + ) + ] + + [ + snippet( + prepend_field ++ + template_field ++ postpend_field ++ solution_field ++ testcases_fields + ) + ] end end @@ -227,16 +244,32 @@ defmodule Cadet.Test.XMLGenerator do {"SNIPPET", nil, children} end + defp prepend(content) do + {"PREPEND", nil, content} + end + defp template(content) do {"TEMPLATE", nil, content} end + defp postpend(content) do + {"POSTPEND", nil, content} + end + defp solution(content) do {"SOLUTION", nil, content} end - defp grader(content) do - {"GRADER", nil, content} + defp testcases(children) do + {"TESTCASES", nil, children} + end + + defp public(raw_attrs, content) do + {"PUBLIC", map_permit_keys(raw_attrs, ~w(score answer)a), content} + end + + defp private(raw_attrs, content) do + {"PRIVATE", map_permit_keys(raw_attrs, ~w(score answer)a), content} end defp map_permit_keys(map, keys) when is_map(map) and is_list(keys) do From f3ec4ab0faa7f4740d3bea5bfa88d2b2f4c844ab Mon Sep 17 00:00:00 2001 From: Shuming Date: Wed, 27 Mar 2019 15:08:37 +0800 Subject: [PATCH 03/18] updated schema --- schema.png | Bin 426759 -> 293785 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/schema.png b/schema.png index c02fed7ec8c5532457316d4c90a258a0f9acbb7a..2e0087262134e3fcd4f82350ccd1884be5f643dd 100644 GIT binary patch literal 293785 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

AgC;qji_e*c~q7?Xg?WcsI%0DtENROQ(%zs^b680`HW*|Rm` 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%0DysEq1ug+SvE3wuBJtjq;T0h@p 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