test directory:
test/reporter/simple.js
test/test-minified.html
test/mocha.css
test/js/chai_helpers.js
test/js/modernizr.js
test/js/mocha_setup.js
test/js/sinon.js
test/js/p5_helpers.js
test/node/helpers.js
test/node/test-docs-preprocessor.js
test/unit/dom/dom.js
test/unit/spec.js
test/unit/data/local_storage.js
test/unit/data/p5.TypedDict.js
test/unit/events/keyboard.js
test/unit/events/mouse.js
test/unit/events/touch.js
test/unit/events/acceleration.js
test/unit/color/p5.Color.js
test/unit/color/setting.js
test/unit/color/color_conversion.js
test/unit/color/creating_reading.js
test/unit/image/loading.js
test/unit/image/pixels.js
test/unit/image/filters.js
test/unit/image/downloading.js
test/unit/image/p5.Image.js
test/unit/assets/books.xml
test/unit/assets/target.gif
test/unit/assets/target_small.gif
test/unit/assets/frag.glsl
test/unit/assets/ascii
test/unit/assets/sentences.txt
test/unit/assets/acmesa.ttf
test/unit/assets/vert.glsl
test/unit/assets/teapot.obj
test/unit/assets/csv.csv
test/unit/assets/dispose_previous.gif
test/unit/assets/empty_lines.txt
test/unit/assets/dispose_background.gif
test/unit/assets/cat-with-hole.png
test/unit/assets/array.js
test/unit/assets/object.json
test/unit/assets/beat.mp3
test/unit/assets/object.js
test/unit/assets/cat.jpg
test/unit/assets/many_lines.txt
test/unit/assets/white_black.gif
test/unit/assets/ascii.stl
test/unit/assets/cat.webm
test/unit/assets/array.json
test/unit/assets/dispose_none.gif
test/unit/assets/nyan_cat.gif
test/unit/accessibility/describe.js
test/unit/accessibility/outputs.js
test/unit/math/noise.js
test/unit/math/calculation.js
test/unit/math/random.js
test/unit/math/trigonometry.js
test/unit/math/p5.Vector.js
test/unit/typography/loadFont.js
test/unit/typography/p5.Font.js
test/unit/typography/attributes.js
test/unit/webgl/light.js
test/unit/webgl/p5.Texture.js
test/unit/webgl/p5.Shader.js
test/unit/webgl/p5.Geometry.js
test/unit/webgl/p5.Matrix.js
test/unit/webgl/3d_primitives.js
test/unit/webgl/p5.Camera.js
test/unit/webgl/interaction.js
test/unit/webgl/normal.js
test/unit/webgl/p5.RendererGL.js
test/unit/io/saveTable.js
test/unit/io/loadShader.js
test/unit/io/loadModel.js
test/unit/io/loadBytes.js
test/unit/io/loadTable.js
test/unit/io/loadStrings.js
test/unit/io/loadImage.js
test/unit/io/loadJSON.js
test/unit/io/loadXML.js
test/unit/io/files.js
test/unit/utilities/array_functions.js
test/unit/utilities/time_date.js
test/unit/utilities/conversion.js
test/unit/utilities/string_functions.js
test/unit/core/preload.js
test/unit/core/rendering.js
test/unit/core/structure.js
test/unit/core/transform.js
test/unit/core/vertex.js
test/unit/core/version.js
test/unit/core/p5.Element.js
test/unit/core/curves.js
test/unit/core/main.js
test/unit/core/attributes.js
test/unit/core/environment.js
test/unit/core/2d_primitives.js
test/unit/core/p5.Graphics.js
test/unit/core/error_helpers.js
test/.eslintrc
test/test-reference.html
test/manual-test-examples/dom/fingers.mov
test/manual-test-examples/dom/fingers.webm
test/manual-test-examples/dom/lucky_dragons.ogg
test/manual-test-examples/dom/lucky_dragons.mp3
test/manual-test-examples/mouse-events/fingers.mov
test/manual-test-examples/module.html
test/manual-test-examples/tint-performance/sketch.js
test/manual-test-examples/tint-performance/index.html
test/manual-test-examples/tint-performance/flowers-large.jpg
test/manual-test-examples/p5.Image/filter-images.js
test/manual-test-examples/p5.Image/cropping.html
test/manual-test-examples/p5.Image/loadPixels.html
test/manual-test-examples/p5.Image/animate.html
test/manual-test-examples/p5.Image/drawing.html
test/manual-test-examples/p5.Image/filter.html
test/manual-test-examples/p5.Image/copying.html
test/manual-test-examples/p5.Image/manipulate-images.js
test/manual-test-examples/p5.Image/unicorn.jpg
test/manual-test-examples/p5.Image/manipulate.html
test/manual-test-examples/p5.Image/saving.html
test/manual-test-examples/p5.Image/saving-images.js
test/manual-test-examples/p5.Image/cropping-images.js
test/manual-test-examples/p5.Image/copying-images.js
test/manual-test-examples/p5.Image/animate-image.js
test/manual-test-examples/p5.Image/african-savanna.png
test/manual-test-examples/p5.Image/cat.jpg
test/manual-test-examples/p5.Image/drawing-images.js
test/manual-test-examples/p5.Image/sprite_sheet.jpg
test/manual-test-examples/p5.Image/running-cat.png
test/manual-test-examples/p5.Image/cat-with-alpha.png
test/manual-test-examples/p5.Image/loadPixels.js
test/manual-test-examples/keyboard/keyIsPressed.js
test/manual-test-examples/keyboard/gamestyle.html
test/manual-test-examples/keyboard/keyIsPressed.html
test/manual-test-examples/keyboard/gamestyle.js
test/manual-test-examples/pixel/update-pixels.js
test/manual-test-examples/pixel/set-pixels.html
test/manual-test-examples/pixel/unicorn.jpg
test/manual-test-examples/pixel/update-pixels.html
test/manual-test-examples/pixel/set-pixels.js
test/manual-test-examples/p5.Font/SourceSansPro-Bold.ttf
test/manual-test-examples/p5.Font/PlayfairDisplay-Regular.ttf
test/manual-test-examples/p5.Font/acmesa.ttf
test/manual-test-examples/p5.Font/Merriweather-LightItalic.ttf
test/manual-test-examples/p5.Font/Lato-Black.ttf
test/manual-test-examples/p5.Font/Helvetica.ttf
test/manual-test-examples/p5.Font/FiraSans-Book.otf
test/manual-test-examples/p5.Font/AndaleMono.ttf
test/manual-test-examples/p5.Font/Inconsolata-Bold.ttf
test/manual-test-examples/p5.Font/OpenSans-Regular.ttf
test/manual-test-examples/p5.Font/SourceSansPro-Regular.otf
test/manual-test-examples/p5.Font/Montserrat-Regular.ttf
test/manual-test-examples/p5.Font/SourceSansPro-Italic.ttf
test/manual-test-examples/.eslintrc
test/manual-test-examples/loadingscreen/mammals.csv
test/manual-test-examples/loadingscreen/test.json
test/manual-test-examples/loadingscreen/AvenirNextLTPro-Demi.otf

webgl test top:
suite('p5.RendererGL', function() {
  var myp5;

  if (!window.Modernizr.webgl) {
    return;
  }

  setup(function() {
    myp5 = new p5(function(p) {
      p.setup = function() {};
      p.draw = function() {};
    });
  });

  teardown(function() {
    myp5.remove();
  });

  suite('createCanvas(w, h, WEBGL)', function() {
    test('creates a p5.RendererGL renderer', function() {
      myp5.createCanvas(100, 100, myp5.WEBGL);
      assert.instanceOf(myp5._renderer, p5.RendererGL);
    });
  });

  suite('webglVersion', function() {
    test('should return WEBGL2 by default', function() {
      myp5.createCanvas(10, 10, myp5.WEBGL);
      assert.equal(myp5.webglVersion, myp5.WEBGL2);
    });

    test('should return WEBGL1 after setAttributes', function() {
      myp5.createCanvas(10, 10, myp5.WEBGL);
      myp5.setAttributes({ version: 1 });
      assert.equal(myp5.webglVersion, myp5.WEBGL);
    });

    suite('when WebGL2 is unavailable', function() {
      let prevGetContext;
      setup(function() {
        prevGetContext = HTMLCanvasElement.prototype.getContext;
        // Mock WebGL2 being unavailable
        HTMLCanvasElement.prototype.getContext = function(type, attrs) {
          if (type === 'webgl2') {
            return undefined;
          } else {
            return prevGetContext.call(this, type, attrs);
          }
        };
      });

      teardown(function() {
        // Put back the actual implementation
        HTMLCanvasElement.prototype.getContext = prevGetContext;
      });

      test('should return WEBGL1', function() {
        myp5.createCanvas(10, 10, myp5.WEBGL);
        assert.equal(myp5.webglVersion, myp5.WEBGL);
      });
    });
  });

  suite('default stroke shader', function() {
    test('check activate and deactivating fill and stroke', function(done) {
      myp5.noStroke();
      assert(
        !myp5._renderer._doStroke,
        'stroke shader still active after noStroke()'
      );
      assert.isTrue(
        myp5._renderer._doFill,
        'fill shader deactivated by noStroke()'
      );
      myp5.stroke(0);
      myp5.noFill();
      assert(
        myp5._renderer._doStroke,
        'stroke shader not active after stroke()'
      );

grunt test config snippets:
Gruntfile.js:157:    // Set up node-side (non-browser) mocha tests.
Gruntfile.js:158:    mochaTest: {
Gruntfile.js:169:    // Set up the mocha task, used for running the automated tests.
Gruntfile.js:170:    mochaChrome: {
Gruntfile.js:313:    // This is a static server which is used when testing connectivity for the
Gruntfile.js:317:      server: connectConfig(),
Gruntfile.js:377:  grunt.loadNpmTasks('grunt-mocha-test');
Gruntfile.js:402:    'connect:server',
Gruntfile.js:403:    'mochaChrome',
Gruntfile.js:404:    'mochaTest',
Gruntfile.js:409:    'connect:server',
Gruntfile.js:410:    'mochaChrome',
Gruntfile.js:411:    'mochaTest',
Gruntfile.js:415:  grunt.registerTask('yui:test', ['yui', 'connect:yui', 'mochaChrome:yui']);
test/test-minified.html:5:  <link rel="stylesheet" href="mocha.css"/>
test/test-minified.html:10:  <div id="mocha"></div>
test/test-minified.html:12:  <!-- mocha -->
test/test-minified.html:13:  <script src="../node_modules/mocha/mocha.js" type="text/javascript" charset="utf-8"></script>
test/test-minified.html:14:<script src="js/mocha_setup.js" type="text/javascript"></script>
test/test-minified.html:34:  <!-- run mocha -->
test/test-minified.html:37:      mocha.run();
test/mocha.css:7:#mocha {
test/mocha.css:12:#mocha ul,
test/mocha.css:13:#mocha li {
test/mocha.css:18:#mocha ul {
test/mocha.css:22:#mocha h1,
test/mocha.css:23:#mocha h2 {
test/mocha.css:27:#mocha h1 {
test/mocha.css:33:#mocha h1 a {
test/mocha.css:38:#mocha h1 a:hover {
test/mocha.css:42:#mocha .suite .suite h1 {
test/mocha.css:47:#mocha .hidden {
test/mocha.css:51:#mocha h2 {
test/mocha.css:57:#mocha .suite {
test/mocha.css:61:#mocha .test {
test/mocha.css:66:#mocha .test.pending:hover h2::after {
test/mocha.css:71:#mocha .test.pass.medium .duration {
test/mocha.css:75:#mocha .test.pass.slow .duration {
test/mocha.css:79:#mocha .test.pass::before {
test/mocha.css:88:#mocha .test.pass .duration {
test/mocha.css:103:#mocha .test.pass.fast .duration {
test/mocha.css:107:#mocha .test.pending {
test/mocha.css:111:#mocha .test.pending::before {
test/mocha.css:116:#mocha .test.fail {
test/mocha.css:120:#mocha .test.fail pre {
test/mocha.css:124:#mocha .test.fail::before {
test/mocha.css:133:#mocha .test pre.error {
test/mocha.css:144:#mocha .test pre {
test/mocha.css:163:#mocha .test h2 {
test/mocha.css:167:#mocha .test a.replay {
test/mocha.css:189:#mocha .test:hover a.replay {
test/mocha.css:193:#mocha-report.pass .test.fail {
test/mocha.css:197:#mocha-report.fail .test.pass {
test/mocha.css:201:#mocha-report.pending .test.pass,
test/mocha.css:202:#mocha-report.pending .test.fail {
test/mocha.css:205:#mocha-report.pending .test.pass.pending {
test/mocha.css:209:#mocha-error {
test/mocha.css:216:#mocha-stats {
test/mocha.css:226:#mocha-stats .progress {
test/mocha.css:231:#mocha-stats em {
test/mocha.css:235:#mocha-stats a {
test/mocha.css:240:#mocha-stats a:hover {
test/mocha.css:244:#mocha-stats li {
test/mocha.css:251:#mocha-stats canvas {
test/mocha.css:256:#mocha code .comment { color: #ddd; }
test/mocha.css:257:#mocha code .init { color: #2f6fad; }
test/mocha.css:258:#mocha code .string { color: #5890ad; }
test/mocha.css:259:#mocha code .keyword { color: #8a6343; }
test/mocha.css:260:#mocha code .number { color: #2f6fad; }
test/mocha.css:263:  #mocha {
test/mocha.css:267:  #mocha #stats {
test/js/modernizr.js:2: * https://modernizr.com/download/?-adownload-ambientlight-animation-apng-appearance-applicationcache-atobbtoa-audio-audioloop-audiopreload-backdropfilter-backgroundblendmode-backgroundcliptext-backgroundsize-batteryapi-bdi-beacon-bgpositionshorthand-bgpositionxy-bgrepeatspace_bgrepeatround-bgsizecover-blobconstructor-bloburls-blobworkers-borderimage-borderradius-boxshadow-boxsizing-canvas-canvasblending-canvastext-canvaswinding-capture-checked-classlist-contains-contenteditable-contextmenu-cookies-cors-cryptography-cssall-cssanimations-csscalc-csschunit-csscolumns-cssescape-cssexunit-cssfilters-cssgradients-csshyphens_softhyphens_softhyphensfind-cssinvalid-cssmask-csspointerevents-csspositionsticky-csspseudoanimations-csspseudotransitions-cssreflections-cssremunit-cssresize-cssscrollbar-csstransforms-csstransforms3d-csstransitions-cssvalid-cssvhunit-cssvmaxunit-cssvminunit-cssvwunit-cubicbezierrange-customevent-customprotocolhandler-dart-datalistelem-dataset-datauri-dataview-dataworkers-details-devicemotion_deviceorientation-directory-displaytable-documentfragment-ellipsis-emoji-es5-es5array-es5date-es5function-es5object-es5string-es5syntax-es5undefined-es6array-es6math-es6number-es6object-es6string-eventlistener-eventsource-exiforientation-fetch-fileinput-filereader-filesystem-flash-flexbox-flexboxlegacy-flexboxtweener-flexwrap-fontface-formattribute-formvalidation-framed-fullscreen-gamepads-generatedcontent-generators-geolocation-getrandomvalues-getusermedia-hashchange-hidden-hiddenscroll-history-hsla-htmlimports-ie8compat-indexeddb-indexeddbblob-inlinesvg-input-inputformaction-inputformenctype-inputformmethod-inputformtarget-inputtypes-intl-jpeg2000-jpegxr-json-lastchild-localizednumber-localstorage-lowbandwidth-lowbattery-matchmedia-mathml-mediaqueries-microdata-multiplebgs-mutationobserver-notification-nthchild-objectfit-olreversed-oninput-opacity-outputelem-overflowscrolling-pagevisibility-peerconnection-performance-picture-placeholder-pointerevents-pointerlock-postmessage-preserve3d-progressbar_meter-promises-proximity-queryselector-quotamanagement-regions-requestanimationframe-requestautocomplete-rgba-ruby-sandbox-scriptasync-scriptdefer-seamless-search-serviceworker-sessionstorage-shapes-sharedworkers-siblinggeneral-sizes-smil-speechrecognition-speechsynthesis-srcdoc-srcset-strictmode-stylescoped-subpixelfont-supports-svg-svgasimg-svgclippaths-svgfilters-svgforeignobject-target-template-templatestrings-textalignlast-textareamaxlength-textshadow-texttrackapi_track-time-todataurljpeg_todataurlpng_todataurlwebp-touchevents-transferables-typedarrays-unicode-unicoderange-unknownelements-urlparser-userdata-userselect-vibrate-video-videoautoplay-videoloop-videopreload-vml-webaudio-webgl-webglextensions-webintents-webp-webpalpha-webpanimation-websockets-websocketsbinary-websqldatabase-webworkers-willchange-wrapflow-xdomainrequest-xhr2-xhrresponsetype-xhrresponsetypearraybuffer-xhrresponsetypeblob-xhrresponsetypedocument-xhrresponsetypejson-xhrresponsetypetext-addtest-atrule-domprefixes-hasevent-mq-prefixed-prefixedcss-prefixedcssvalue-prefixes-setclasses-shiv-testallprops-testprop-teststyles !*/
test/js/modernizr.js:3:!function(window,document,undefined){function is(A,e){return typeof A===e}function testRunner(){var A,e,t,r,n,o,i;for(var d in tests)if(tests.hasOwnProperty(d)){if(A=[],e=tests[d],e.name&&(A.push(e.name.toLowerCase()),e.options&&e.options.aliases&&e.options.aliases.length))for(t=0;t<e.options.aliases.<response clipped><NOTE>Due to the max output limit, only part of the full response has been shown to you.</NOTE>bBuilder||window.MSBlobBuilder||window.OBlobBuilder,r=r||window.MozURL||window.webkitURL||window.MSURL||window.OURL);var n,o,i,d,a,s="Modernizr",l="this.onmessage=function(e){postMessage(e.data)}";try{n=new Blob([l],{type:"text/javascript"})}catch(c){}n||(o=new t,o.append(l),n=o.getBlob()),d=r.createObjectURL(n),i=new Worker(d),i.onmessage=function(A){addTest("blobworkers",s===A.data),e()},i.onerror=A,a=setTimeout(A,200),i.postMessage(s)}catch(c){A()}}),Modernizr.addAsyncTest(function(){try{var A="Modernizr",e=new Worker("data:text/javascript;base64,dGhpcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7cG9zdE1lc3NhZ2UoZS5kYXRhKX0=");e.onmessage=function(t){e.terminate(),addTest("dataworkers",A===t.data),e=null},e.onerror=function(){addTest("dataworkers",!1),e=null},setTimeout(function(){addTest("dataworkers",!1)},200),e.postMessage(A)}catch(t){setTimeout(function(){addTest("dataworkers",!1)},0)}});var cssomPrefixes=ModernizrProto._config.usePrefixes?omPrefixes.split(" "):[];ModernizrProto._cssomPrefixes=cssomPrefixes;var atRule=function(A){var e,t=prefixes.length,r=window.CSSRule;if("undefined"==typeof r)return undefined;if(!A)return!1;if(A=A.replace(/^@/,""),e=A.replace(/-/g,"_").toUpperCase()+"_RULE",e in r)return"@"+A;for(var n=0;t>n;n++){var o=prefixes[n],i=o.toUpperCase()+"_"+e;if(i in r)return"@-"+o.toLowerCase()+"-"+A}return!1};ModernizrProto.atRule=atRule;var hasEvent=function(){function A(A,t){var r;return A?(t&&"string"!=typeof t||(t=createElement(t||"div")),A="on"+A,r=A in t,!r&&e&&(t.setAttribute||(t=createElement("div")),t.setAttribute(A,""),r="function"==typeof t[A],t[A]!==undefined&&(t[A]=undefined),t.removeAttribute(A)),r):!1}var e=!("onblur"in document.documentElement);return A}();ModernizrProto.hasEvent=hasEvent,Modernizr.addTest("ambientlight",hasEvent("devicelight",window)),Modernizr.addTest("hashchange",function(){return hasEvent("hashchange",window)===!1?!1:document.documentMode===undefined||document.documentMode>7}),Modernizr.addTest("inputsearchevent",hasEvent("search")),Modernizr.addTest("pointerevents",function(){var A=!1,e=domPrefixes.length;for(A=Modernizr.hasEvent("pointerdown");e--&&!A;)hasEvent(domPrefixes[e]+"pointerdown")&&(A=!0);return A});var prefixedCSSValue=function(A,e){var t=!1,r=createElement("div"),n=r.style;if(A in n){var o=domPrefixes.length;for(n[A]=e,t=n[A];o--&&!t;)n[A]="-"+domPrefixes[o]+"-"+e,t=n[A]}return""===t&&(t=!1),t};ModernizrProto.prefixedCSSValue=prefixedCSSValue,Modernizr.addTest("audio",function(){var A=createElement("audio"),e=!1;try{e=!!A.canPlayType,e&&(e=new Boolean(e),e.ogg=A.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),e.mp3=A.canPlayType('audio/mpeg; codecs="mp3"').replace(/^no$/,""),e.opus=A.canPlayType('audio/ogg; codecs="opus"')||A.canPlayType('audio/webm; codecs="opus"').replace(/^no$/,""),e.wav=A.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),e.m4a=(A.canPlayType("audio/x-m4a;")||A.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(t){}return e}),Modernizr.addTest("canvas",function(){var A=createElement("canvas");return!(!A.getContext||!A.getContext("2d"))}),Modernizr.addTest("canvastext",function(){return Modernizr.canvas===!1?!1:"function"==typeof createElement("canvas").getContext("2d").fillText}),Modernizr.addTest("contenteditable",function(){if("contentEditable"in docElement){var A=createElement("div");return A.contentEditable=!0,"true"===A.contentEditable}}),Modernizr.addTest("emoji",function(){if(!Modernizr.canvastext)return!1;var A=window.devicePixelRatio||1,e=12*A,t=createElement("canvas"),r=t.getContext("2d");return r.fillStyle="#f00",r.textBaseline="top",r.font="32px Arial",r.fillText("🐨",0,0),0!==r.getImageData(e,e,1,1).data[0]}),addTest("htmlimports","import"in createElement("link")),Modernizr.addTest("olreversed","reversed"in createElement("ol")),Modernizr.addTest("userdata",!!createElement("div").addBehavior),Modernizr.addTest("video",function(){var A=createElement("video"),e=!1;try{e=!!A.canPlayType,e&&(e=new Boolean(e),e.ogg=A.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),e.h264=A.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),e.webm=A.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""),e.vp9=A.canPlayType('video/webm; codecs="vp9"').replace(/^no$/,""),e.hls=A.canPlayType('application/x-mpegURL; codecs="avc1.42E01E"').replace(/^no$/,""))}catch(t){}return e}),Modernizr.addTest("vml",function(){var A,e=createElement("div"),t=!1;return isSVG||(e.innerHTML='<v:shape id="vml_flag1" adj="1" />',A=e.firstChild,"style"in A&&(A.style.behavior="url(#default#VML)"),t=A?"object"==typeof A.adj:!0),t}),Modernizr.addTest("webanimations","animate"in createElement("div")),Modernizr.addTest("webgl",function(){var A=createElement("canvas"),e="probablySupportsContext"in A?"probablySupportsContext":"supportsContext";return e in A?A[e]("webgl")||A[e]("experimental-webgl"):"WebGLRenderingContext"in window}),Modernizr.addTest("adownload",!window.externalHost&&"download"in createElement("a")),Modernizr.addTest("audioloop","loop"in createElement("audio")),Modernizr.addAsyncTest(function(){function A(t){clearTimeout(e);var n=t!==undefined&&"loadeddata"===t.type?!0:!1;r.removeEventListener("loadeddata",A,!1),addTest("audiopreload",n),r.parentNode.removeChild(r)}var e,t=300,r=createElement("audio"),n=r.style;if(!(Modernizr.audio&&"preload"in r))return void addTest("audiopreload",!1);n.position="absolute",n.height=0,n.width=0;try{if(Modernizr.audio.mp3)r.src="data:audio/mpeg;base64,//MUxAAB6AXgAAAAAPP+c6nf//yi/6f3//MUxAMAAAIAAAjEcH//0fTX6C9Lf//0//MUxA4BeAIAAAAAAKX2/6zv//+IlR4f//MUxBMCMAH8AAAAABYWalVMQU1FMy45//MUxBUB0AH0AAAAADkuM1VVVVVVVVVV//MUxBgBUATowAAAAFVVVVVVVVVVVVVV";else if(Modernizr.audio.m4a)r.src="data:audio/x-m4a;base64,AAAAGGZ0eXBNNEEgAAACAGlzb21pc28yAAAACGZyZWUAAAAfbWRhdN4EAABsaWJmYWFjIDEuMjgAAAFoAQBHAAACiG1vb3YAAABsbXZoZAAAAAB8JbCAfCWwgAAAA+gAAAAYAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAG0dHJhawAAAFx0a2hkAAAAD3wlsIB8JbCAAAAAAQAAAAAAAAAYAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAABUG1kaWEAAAAgbWRoZAAAAAB8JbCAfCWwgAAArEQAAAQAVcQAAAAAAC1oZGxyAAAAAAAAAABzb3VuAAAAAAAAAAAAAAAAU291bmRIYW5kbGVyAAAAAPttaW5mAAAAEHNtaGQAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAL9zdGJsAAAAW3N0c2QAAAAAAAAAAQAAAEttcDRhAAAAAAAAAAEAAAAAAAAAAAACABAAAAAArEQAAAAAACdlc2RzAAAAAAMZAAEABBFAFQAAAAABftAAAAAABQISCAYBAgAAABhzdHRzAAAAAAAAAAEAAAABAAAEAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAAUc3RzegAAAAAAAAAXAAAAAQAAABRzdGNvAAAAAAAAAAEAAAAoAAAAYHVkdGEAAABYbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAraWxzdAAAACOpdG9vAAAAG2RhdGEAAAABAAAAAExhdmY1Mi42NC4y";else if(Modernizr.audio.ogg)r.src="data:audio/ogg;base64,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lFJKKaWUUkoppZRSSimllFJKKaWUUkqppJRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoplVJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSCgCQinAAkHowoQwUGrISAEgFAACMUUopxpyDEDHmGGPQSSgpYsw5xhyUklLlHIQQUmktt8o5CCGk1FJtmXNSWosx5hgz56SkFFvNOYdSUoux5ppr7qS0VmuuNedaWqs115xzzbm0FmuuOdecc8sx15xzzjnnGHPOOeecc84FAOA0OACAHtiwOsJJ0VhgoSErAYBUAAACGaUYc8456BBSjDnnHIQQIoUYc845CCFUjDnnHHQQQqgYc8w5CCGEkDnnHIQQQgghcw466CCEEEIHHYQQQgihlM5BCCGEEEooIYQQQgghhBA6CCGEEEIIIYQQQgghhFJKCCGEEEIJoZRQAABggQMAQIANqyOcFI0FFhqyEgAAAgCAHJagUs6EQY5Bjw1BylEzDUJMOdGZYk5qMxVTkDkQnXQSGWpB2V4yCwAAgCAAIMAEEBggKPhCCIgxAABBiMwQCYVVsMCgDBoc5gHAA0SERACQmKBIu7iALgNc0MVdB0IIQhCCWBxAAQk4OOGGJ97whBucoFNU6iAAAAAAAAwA4AEA4KAAIiKaq7C4wMjQ2ODo8AgAAAAAABYA+AAAOD6AiIjmKiwuMDI0Njg6PAIAAAAAAAAAAICAgAAAAAAAQAAAAICAT2dnUwAE7AwAAAAAAAD/QwAAAgAAADuydfsFAQEBAQEACg4ODg==";else{
test/js/mocha_setup.js:1:mocha.setup('tdd');
test/js/mocha_setup.js:2:mocha.reporter('html');
test/js/sinon.js:1463:            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
test/js/sinon.js:5037: * The Sinon "server" mimics a web server that receives requests from
test/js/sinon.js:5069:            throw new TypeError("Fake server response body should be string, but was " +
test/js/sinon.js:5111:                var server = create(this);
test/js/sinon.js:5117:                server.requests = [];
test/js/sinon.js:5120:                    server.addRequest(xhrObj);
test/js/sinon.js:5123:                return server;
test/js/sinon.js:5127:                var server = this;
test/js/sinon.js:5131:                    server.handleRequest(this);
test/js/sinon.js:5133:                    if (server.respondImmediately) {
test/js/sinon.js:5134:                        server.respond();
test/js/sinon.js:5135:                    } else if (server.autoRespond && !server.responding) {
test/js/sinon.js:5137:                            server.responding = false;
test/js/sinon.js:5138:                            server.respond();
test/js/sinon.js:5139:                        }, server.autoRespondAfter || 10);
test/js/sinon.js:5141:                        server.responding = true;
test/js/sinon.js:5241:                    sinon.logError("Fake server request processing", e);
test/js/sinon.js:5273: * @depend fake_server.js
test/js/sinon.js:5310:                    var server = this;
test/js/sinon.js:5313:                        server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
test/js/sinon.js:5319:                        server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
test/js/sinon.js:5359:        require("./fake_server");
test/js/sinon.js:5378: * @depend util/fake_server_with_clock.js
test/js/sinon.js:5412:                    sandbox.serverPrototype = config.useFakeServer;
test/js/sinon.js:5436:            serverPrototype: sinon.fakeServer,
test/js/sinon.js:5439:                var proto = this.serverPrototype || sinon.fakeServer;
test/js/sinon.js:5445:                this.server = proto.create();
test/js/sinon.js:5446:                return this.add(this.server);
test/js/sinon.js:5456:                if (this.server) {
test/js/sinon.js:5457:                    obj.server = this.server;
test/js/sinon.js:5458:                    obj.requests = this.server.requests;
test/js/sinon.js:5518:        require("./util/fake_server_with_clock");
test/js/sinon.js:5609:            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
test/unit/core/error_helpers.js:550:      // under mocha. Also the stacktrace gets filled with mocha internal
test/.eslintrc:3:    "mocha": true
test/test-reference.html:5:  <link rel="stylesheet" href="mocha.css"/>
test/test-reference.html:11:  <div id="mocha"></div>
test/test-reference.html:13:  <!-- mocha -->
test/test-reference.html:14:  <script src="../node_modules/mocha/mocha.js" type="text/javascript" charset="utf-8"></script>
test/test-reference.html:15:  <script src="js/mocha_setup.js" type="text/javascript"></script>
test/test-reference.html:186:          // When a user clicks on a specific test, mocha shows its
test/test-reference.html:226:      mocha.run();
test/test.html:5:  <link rel="stylesheet" href="mocha.css"/>
test/test.html:9:  <div id="mocha"></div>
test/test.html:11:  <!-- mocha -->
[The command completed with exit code 0.]
[Current working directory: /workspace/p5.js]
[Python interpreter: /usr/bin/python]
[Command finished with exit code 0]