Add context code support to exercises (optional)

Partial #52, fixes #49, fixes #46
This commit is contained in:
Aaron O'Mullan
2014-04-08 16:58:04 -07:00
parent 392573a990
commit 9265b0185a
6 changed files with 48 additions and 15 deletions
+2 -1
View File
@@ -8,6 +8,7 @@ define([
var prepareExercise = function($exercise) {
var codeSolution = $exercise.find(".code-solution").text();
var codeValidation = $exercise.find(".code-validation").text();
var codeContext = $exercise.find(".code-context").text();
var editor = ace.edit($exercise.find(".editor").get(0));
editor.setTheme("ace/theme/tomorrow");
@@ -20,7 +21,7 @@ define([
analytic.track("exercise.submit");
execute("javascript", editor.getValue(), codeValidation, function(err, result) {
execute("javascript", editor.getValue(), codeValidation, codeContext, function(err, result) {
$exercise.toggleClass("return-error", err != null);
$exercise.toggleClass("return-success", err == null);
if (err) $exercise.find(".alert-danger").text(err.message || err);
+3 -2
View File
@@ -2,6 +2,7 @@ define(function() {
return {
id: "javascript",
assertCode: "function assert(condition, message) { \nif (!condition) { \n throw message || \"Assertion failed\"; \n } \n }\n",
REPL: JSREPL
REPL: JSREPL,
sep: ";\n",
};
});
});
+13 -5
View File
@@ -71,13 +71,21 @@ define([
repl.loadLanguage(lang.id, eventHandler);
};
var execute = function(lang, solution, validation, callback) {
var execute = function(lang, solution, validation, context, callback) {
// Language data
var langd = LANGUAGES[lang];
// Check language is supported
if (!LANGUAGES[lang]) return callback(new Error("Language '"+lang+"' not available for execution"));
if (!langd) return callback(new Error("Language '"+lang+"' not available for execution"));
// Validate with validation code
var code = [solution, LANGUAGES[lang].assertCode, validation].join(";\n");
evalJS(LANGUAGES[lang], code, function(err, res) {
var code = [
context,
solution,
langd.assertCode,
validation,
].join(langd.sep);
evalJS(langd, code, function(err, res) {
if(err) return callback(err);
if (res.type == "error") callback(new Error(res.value));
@@ -86,4 +94,4 @@ define([
};
return execute;
});
});