diff --git a/client/commonFramework/execute-challenge-stream.js b/client/commonFramework/execute-challenge-stream.js index de7e102751..181868e581 100644 --- a/client/commonFramework/execute-challenge-stream.js +++ b/client/commonFramework/execute-challenge-stream.js @@ -15,6 +15,7 @@ window.common = (function(global) { common.executeChallenge$ = function executeChallenge$() { const code = common.editor.getValue(); + const originalCode = code; const head = common.arrayToNewLineString(common.head); const tail = common.arrayToNewLineString(common.tail); @@ -75,6 +76,7 @@ window.common = (function(global) { data, code, userTests, + originalCode, output: data.output.replace(/\\\"/gi, '') }); }); diff --git a/client/commonFramework/run-tests-stream.js b/client/commonFramework/run-tests-stream.js index b33718bb09..df5bc39dbd 100644 --- a/client/commonFramework/run-tests-stream.js +++ b/client/commonFramework/run-tests-stream.js @@ -5,14 +5,19 @@ window.common = (function(global) { common = { init: [] } } = global; - common.runTests$ = function runTests$({ code, userTests, ...rest }) { + common.runTests$ = function runTests$({ + code, + originalCode, + userTests, + ...rest + }) { return Observable.from(userTests) .map(function(test) { /* eslint-disable no-unused-vars */ const assert = chai.assert; - const editor = { getValue() { return code; }}; + const editor = { getValue() { return originalCode; }}; /* eslint-enable no-unused-vars */ try { diff --git a/client/commonFramework/update-preview.js b/client/commonFramework/update-preview.js index 8d2a20c735..fb4e36d605 100644 --- a/client/commonFramework/update-preview.js +++ b/client/commonFramework/update-preview.js @@ -1,6 +1,6 @@ window.common = (function(global) { const { - Rx: { Observable }, + Rx: { BehaviorSubject, Observable }, common = { init: [] } } = global; @@ -27,6 +27,11 @@ window.common = (function(global) { const iFrameScript$ = common.getScriptContent$('/js/iFrameScripts.js').shareReplay(); + // behavior subject allways remembers the last value + // we use this to determine if runPreviewTest$ is defined + // and prime it with false + common.previewReady$ = new BehaviorSubject(false); + // runPreviewTests$ should be set up in the preview window common.runPreviewTests$ = () => Observable.throw({ err: new Error('run preview not enabled') }); @@ -42,13 +47,16 @@ window.common = (function(global) { return iFrameScript$ .map(script => ``) .flatMap(script => { + // we make sure to override the last value in the + // subject to false here. + common.previewReady$.onNext(false); preview.open(); preview.write(libraryIncludes + code + '' + script); preview.close(); - return Observable.fromCallback($(preview).ready, $(preview))() - .first() - // delay is need here for first initial run - .delay(100); + // now we filter false values and wait for the first true + return common.previewReady$ + .filter(ready => ready) + .first(); }) .map(() => code); }; diff --git a/client/iFrameScripts.js b/client/iFrameScripts.js index b4c9523317..7bbaa3eb10 100644 --- a/client/iFrameScripts.js +++ b/client/iFrameScripts.js @@ -35,4 +35,9 @@ window.__$(function() { .map(tests => ({ ...rest, tests })); }; + // now that the runPreviewTest$ is defined + // we set the subject to true + // this will let the updatePreview + // script now that we are ready. + common.previewReady$.onNext(true); });