defineSuite([ 'Scene/CreditDisplay', 'Core/Credit', 'Core/defined', 'Specs/absolutize' ], function( CreditDisplay, Credit, defined, absolutize) { 'use strict'; var container; var creditDisplay; var imageUrl; beforeEach(function() { imageUrl = absolutize('./Data/Images/Green.png'); container = document.createElement('div'); container.id = 'credit-container'; document.body.appendChild(container); }); afterEach(function() { document.body.removeChild(container); CreditDisplay.cesiumCredit = undefined; CreditDisplay._cesiumCreditInitialized = false; if (defined(creditDisplay)) { creditDisplay.destroy(); creditDisplay = undefined; } }); // For the sake of the tests, we remove the logo // credit at the beginning of every frame function beginFrame(creditDisplay) { creditDisplay.beginFrame(); } it('credit display throws with no container', function() { expect(function() { return new CreditDisplay(); }).toThrowDeveloperError(); }); it('credit display addCredit throws when credit is undefined', function() { expect(function() { creditDisplay = new CreditDisplay(container); creditDisplay.addCredit(); }).toThrowDeveloperError(); }); it('credit display addDefaultCredit throws when credit is undefined', function() { expect(function() { creditDisplay = new CreditDisplay(container); creditDisplay.addDefaultCredit(); }).toThrowDeveloperError(); }); it('credit display removeDefaultCredit throws when credit is undefined', function() { expect(function() { creditDisplay = new CreditDisplay(container); creditDisplay.removeDefaultCredit(); }).toThrowDeveloperError(); }); it('credits have unique ids', function() { var credit1 = new Credit('credit1'); var credit2 = new Credit('credit2'); expect(credit1.id).not.toEqual(credit2.id); var credit3 = new Credit('credit1'); expect(credit1.id).toEqual(credit3.id); }); it('credit clone works', function() { var credit1 = new Credit('credit1'); var credit2 = Credit.clone(credit1); expect(credit1).toEqual(credit2); var credit3 = Credit.clone(undefined); expect(credit3).toBeUndefined(); }); it('credit display displays a credit', function() { creditDisplay = new CreditDisplay(container); var credit = new Credit('CesiumJS.org', true); beginFrame(creditDisplay); creditDisplay.addCredit(credit); creditDisplay.endFrame(); var creditContainer = container.childNodes[1]; expect(creditContainer.childNodes.length).toEqual(1); var child10 = creditContainer.childNodes[0]; expect(child10.childNodes.length).toEqual(1); }); it('credit display updates html when credits change', function() { var credit1 = new Credit('credit1', true); var credit2 = new Credit('credit2', true); creditDisplay = new CreditDisplay(container); // add only credit1 during the frame beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.endFrame(); var innerHTMLWithCredit1 = container.innerHTML; var creditContainer = container.childNodes[1]; expect(creditContainer.childNodes.length).toEqual(1); expect(creditContainer.childNodes[0].innerHTML).toEqual('credit1'); // add only credit2 during the frame beginFrame(creditDisplay); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); var innerHTMLWithCredit2 = container.innerHTML; expect(innerHTMLWithCredit2).not.toEqual(innerHTMLWithCredit1); expect(creditContainer.childNodes.length).toEqual(1); expect(creditContainer.childNodes[0].innerHTML).toEqual('credit2'); // add both credit1 and credit2 during the frame beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); var innerHTMLWithCredit1AndCredit2 = container.innerHTML; expect(innerHTMLWithCredit1AndCredit2).not.toEqual(innerHTMLWithCredit1); expect(innerHTMLWithCredit1AndCredit2).not.toEqual(innerHTMLWithCredit2); expect(creditContainer.childNodes.length).toEqual(3); expect(creditContainer.childNodes[0].innerHTML).toEqual('credit1'); expect(creditContainer.childNodes[2].innerHTML).toEqual('credit2'); // add neither credit during the frame beginFrame(creditDisplay); creditDisplay.endFrame(); expect(container.innerHTML).not.toEqual(innerHTMLWithCredit1); expect(container.innerHTML).not.toEqual(innerHTMLWithCredit2); expect(container.innerHTML).not.toEqual(innerHTMLWithCredit1AndCredit2); expect(creditContainer.childNodes.length).toEqual(0); }); it('credit display uses delimeter', function() { var credit1 = new Credit('credit1', true); var credit2 = new Credit('credit2', true); var delimiter = ', '; creditDisplay = new CreditDisplay(container, ', '); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); var creditContainer = container.childNodes[1]; expect(creditContainer.childNodes.length).toEqual(3); expect(creditContainer.childNodes[0].innerHTML).toEqual('credit1'); expect(creditContainer.childNodes[1].innerHTML).toEqual(delimiter); expect(creditContainer.childNodes[2].innerHTML).toEqual('credit2'); }); it('credit display manages delimeters correctly for text credits', function() { var credit1 = new Credit('credit1', true); var credit2 = new Credit('credit2', true); var credit3 = new Credit('credit3', true); var delimiter = ', '; creditDisplay = new CreditDisplay(container, delimiter); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.addCredit(credit2); creditDisplay.addCredit(credit3); creditDisplay.endFrame(); var creditContainer = container.childNodes[1]; expect(creditContainer.childNodes.length).toEqual(5); expect(creditContainer.childNodes[0]).toEqual(credit1.element); expect(creditContainer.childNodes[1].innerHTML).toEqual(delimiter); expect(creditContainer.childNodes[2]).toEqual(credit2.element); expect(creditContainer.childNodes[3].innerHTML).toEqual(delimiter); expect(creditContainer.childNodes[4]).toEqual(credit3.element); beginFrame(creditDisplay); creditDisplay.addCredit(credit2); creditDisplay.addCredit(credit3); creditDisplay.endFrame(); expect(creditContainer.childNodes.length).toEqual(3); expect(creditContainer.childNodes[0]).toEqual(credit2.element); expect(creditContainer.childNodes[1].innerHTML).toEqual(delimiter); expect(creditContainer.childNodes[2]).toEqual(credit3.element); beginFrame(creditDisplay); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); expect(creditContainer.childNodes.length).toEqual(1); expect(creditContainer.childNodes[0]).toEqual(credit2.element); beginFrame(creditDisplay); creditDisplay.addCredit(credit2); creditDisplay.addCredit(credit3); creditDisplay.endFrame(); expect(creditContainer.childNodes.length).toEqual(3); expect(creditContainer.childNodes[0]).toEqual(credit2.element); expect(creditContainer.childNodes[1].innerHTML).toEqual(delimiter); expect(creditContainer.childNodes[2]).toEqual(credit3.element); }); it('credit display displays default credit', function() { var defaultCredit = new Credit('default credit', true); var credit1 = new Credit('credit1', true); creditDisplay = new CreditDisplay(container, ', '); creditDisplay.addDefaultCredit(defaultCredit); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.endFrame(); var creditContainer = container.childNodes[1]; expect(creditContainer.childNodes.length).toEqual(3); expect(creditContainer.childNodes[0]).toEqual(defaultCredit.element); expect(creditContainer.childNodes[1].innerHTML).toEqual(', '); expect(creditContainer.childNodes[2]).toEqual(credit1.element); beginFrame(creditDisplay); creditDisplay.endFrame(); expect(creditContainer.childNodes.length).toEqual(1); expect(creditContainer.childNodes[0]).toEqual(defaultCredit.element); }); it('credit display displays credits when default is removed', function() { var defaultCredit = new Credit('default credit', true); var credit1 = new Credit('credit1', true); creditDisplay = new CreditDisplay(container, ', '); creditDisplay.addDefaultCredit(defaultCredit); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.endFrame(); var creditContainer = container.childNodes[1]; expect(creditContainer.childNodes.length).toEqual(3); expect(creditContainer.childNodes[0]).toEqual(defaultCredit.element); expect(creditContainer.childNodes[1].innerHTML).toEqual(', '); expect(creditContainer.childNodes[2]).toEqual(credit1.element); creditDisplay.removeDefaultCredit(defaultCredit); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.endFrame(); expect(creditContainer.childNodes.length).toEqual(1); expect(creditContainer.childNodes[0]).toEqual(credit1.element); }); it('credit display only displays one if two credits are equal', function() { var credit1 = new Credit('credit1', true); var credit2 = new Credit('credit1', true); creditDisplay = new CreditDisplay(container); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); var creditContainer = container.childNodes[1]; expect(creditContainer.childNodes.length).toEqual(1); expect(creditContainer.childNodes[0].innerHTML).toEqual('credit1'); }); it('displays credits in a lightbox', function() { var credit1 = new Credit('credit1'); var credit2 = new Credit(''); creditDisplay = new CreditDisplay(container); var creditList = creditDisplay._creditList; creditDisplay.showLightbox(); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.endFrame(); creditDisplay.update(); var innerHTML = creditList.innerHTML; expect(creditList.childNodes.length).toEqual(1); expect(creditList.childNodes[0].childNodes[0]).toEqual(credit1.element); beginFrame(creditDisplay); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); creditDisplay.update(); expect(creditList.innerHTML).not.toEqual(innerHTML); innerHTML = creditList.innerHTML; expect(creditList.childNodes.length).toEqual(1); expect(creditList.childNodes[0].childNodes[0]).toEqual(credit2.element); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); creditDisplay.update(); expect(creditList.innerHTML).not.toEqual(innerHTML); innerHTML = creditList.innerHTML; expect(creditList.childNodes.length).toEqual(2); beginFrame(creditDisplay); creditDisplay.endFrame(); creditDisplay.update(); expect(creditList.innerHTML).not.toEqual(innerHTML); expect(creditList.childNodes.length).toEqual(0); creditDisplay.hideLightbox(); }); it('renders lightbox credits', function() { var credit1 = new Credit('credit1'); var credit2 = new Credit(''); creditDisplay = new CreditDisplay(container); var creditList = creditDisplay._creditList; beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); creditDisplay.update(); expect(creditList.childNodes.length).toEqual(2); creditDisplay.showLightbox(); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); creditDisplay.update(); expect(creditList.childNodes.length).toEqual(2); creditDisplay.hideLightbox(); }); it('updates lightbox when a new frames are not rendered', function() { var credit1 = new Credit('credit1'); var credit2 = new Credit(''); creditDisplay = new CreditDisplay(container); var creditList = creditDisplay._creditList; creditDisplay.update(); expect(creditList.childNodes.length).toEqual(0); beginFrame(creditDisplay); creditDisplay.addCredit(credit1); creditDisplay.addCredit(credit2); creditDisplay.endFrame(); creditDisplay.update(); expect(creditList.childNodes.length).toEqual(2); creditDisplay.showLightbox(); creditDisplay.update(); expect(creditList.childNodes.length).toEqual(2); creditDisplay.hideLightbox(); creditDisplay.update(); expect(creditList.childNodes.length).toEqual(2); creditDisplay.hideLightbox(); }); it('works if Cesium credit removed', function() { creditDisplay = new CreditDisplay(container); var cesiumCredit = CreditDisplay.cesiumCredit; CreditDisplay.cesiumCredit = undefined; creditDisplay.beginFrame(); creditDisplay.endFrame(); expect(creditDisplay._cesiumCreditContainer.childNodes.length).toBe(0); CreditDisplay.cesiumCredit = cesiumCredit; }); it('each credit display has a unique cesium credit', function() { creditDisplay = new CreditDisplay(container); var container2 = document.createElement('div'); var creditDisplay2 = new CreditDisplay(container2); expect(creditDisplay._currentCesiumCredit).toEqual(creditDisplay2._currentCesiumCredit); expect(creditDisplay._currentCesiumCredit).not.toBe(creditDisplay2._currentCesiumCredit); }); });