/// import {Kingdom, Subject} from "../js/kingdom"; import {expect} from "chai" import {JSDOM} from 'jsdom' import * as Sugar from 'sugar' const {window} = new JSDOM(``); global['document'] = window.document; function getParams(): Subject{ var params = { element: 'div', textAsString: 'Hello', properties: { className: 'wrapper', styles:{ backgroundColor:'blue' } }, subjects: [ { element: 'h1', textAsString: 'it\'s me', properties: { className: 'heading', styles:{ color:'white' } } }, { element: 'h2', textAsString: 'How are you?', properties: { className: 'subtitle', styles:{ color:'white' } } }, { element: 'div', properties: { className: 'subtitle', styles: { backgroundColor: 'black', color: 'white' } }, subjects:[{ element: 'div', properties: { className: 'container', }, subjects: [{ element: 'h3', textAsString: 'Testing', properties: { className: 'minor-heading', id: 'minor-heading' } }] }] }] }; return Sugar.Object.clone(params, true) } describe('KingDOM Tests', function(){ describe('When testing the Constructor', function(){ describe("With no parameters", function(){ var kingdom = new Kingdom(); it("element must be empty", function() { expect(kingdom.delegateLord.element).to.equal(''); }); it("children must be initialized and empty", function() { expect(kingdom.delegateLord.subjects).to.eql([]); }); it("properties must be undefined", function() { expect(kingdom.delegateLord.properties).to.be.undefined; }); it("text must be undefined", function() { expect(kingdom.delegateLord.textAsHTML).to.be.undefined; expect(kingdom.delegateLord.textAsString).to.be.undefined; }); }) describe("With bad parameters such as:", function(){ describe("a string", function(){ it("it must throw an error", function() { expect(function(){ var kingdom = new Kingdom('kingdom rules'); }).to.throw(); }); }) describe("an array", function(){ it("it must throw an error", function() { expect(function(){ var kingdom = new Kingdom(['kingdom']); }).to.throw(); }); }) describe("a number", function(){ it("it must throw an error", function() { expect(function(){ var kingdom = new Kingdom(321); }).to.throw(); }); }) describe("an object with unexpected properties", function(){ var value = { name: 'King', children: ['prince', 'princess'], properties:['none'], text: 321 }; var kingdom = new Kingdom(value); it("it will be unfortunately accepted", function() { expect(kingdom.delegateLord).to.equal(value); }); }) }) describe("With good parameters", function(){ var kingdom = new Kingdom(getParams()); it("will be accepted", function() { expect(kingdom.delegateLord).to.eql(getParams()); }); }) }); describe('when calling .getLord() of large data', function(){ var kingdom; beforeEach(function() { kingdom = new Kingdom(getParams()); }); describe("when at root", function(){ it("should give me the root", function() { var subjectAtLevelZero = kingdom.delegateLord; var subjectAtSubZero = kingdom.getLord().delegateLord; expect(kingdom.delegateLord).to.equal(subjectAtLevelZero); expect(kingdom.delegateLord).to.equal(subjectAtSubZero); expect(subjectAtLevelZero).to.equal(subjectAtSubZero); }); }); describe("when TWO levels deep", function(){ it("should give me data at level ONE", function() { var subjectAtLevelOne = kingdom.makeSubjectLordAtIndex(2).delegateLord; var kingomAtLevelTwo = kingdom.makeSubjectLordAtIndex(0); var kindgomAtLevelOne = kingomAtLevelTwo.getLord(); expect(kindgomAtLevelOne.delegateLord).to.equal(subjectAtLevelOne); expect(kingomAtLevelTwo.delegateLord).to.equal(subjectAtLevelOne); expect(kingdom.delegateLord).to.equal(subjectAtLevelOne); }); }) describe("when ONE level deep", function(){ it("should give me data at level ZERO", function() { var subjectAtLevelZero = kingdom.delegateLord; var subjectAtLevelOne = kingdom.makeSubjectLordAtIndex(0).delegateLord; var kindgomAtLevelOne = kingdom.getLord(); expect(kindgomAtLevelOne.delegateLord).to.equal(subjectAtLevelZero); expect(kingdom.delegateLord).to.equal(subjectAtLevelZero); expect(subjectAtLevelOne).not.to.equal(subjectAtLevelZero); }); }) }); describe('when calling .gotoKing() of large data', function(){ var kingdom; beforeEach(function() { kingdom = new Kingdom(getParams()); }); describe("at root", function(){ it("should give me the root", function() { var atLevelZero = kingdom.delegateLord; var atSubZero = kingdom.gotoKing().delegateLord; expect(kingdom.delegateLord).to.equal(atLevelZero); expect(kingdom.delegateLord).to.equal(atSubZero); }); }); describe("when TWO levels deep", function(){ it("should give me data at ROOT", function() { var subjectAtLevelZero = kingdom.delegateLord; var subjectAtLevelOne = kingdom.makeSubjectLordAtIndex(2).delegateLord; var kingomAtLevelTwo = kingdom.makeSubjectLordAtIndex(0); var kindgomAtLevelZero = kingomAtLevelTwo.gotoKing(); expect(kindgomAtLevelZero.delegateLord).to.equal(subjectAtLevelZero); expect(kingomAtLevelTwo.delegateLord).to.equal(subjectAtLevelZero); expect(kingdom.delegateLord).to.equal(subjectAtLevelZero); expect(subjectAtLevelOne).not.to.equal(subjectAtLevelZero); }); }) describe("when ONE level deep", function(){ it("should give me data at level ZERO", function() { var subjectAtLevelZero = kingdom.delegateLord; var subjectAtLevelOne = kingdom.makeSubjectLordAtIndex(0).delegateLord; var kingdomAtLevelZero = kingdom.gotoKing(); expect(kingdomAtLevelZero.delegateLord).to.equal(subjectAtLevelZero); expect(kingdom.delegateLord).to.equal(subjectAtLevelZero); expect(subjectAtLevelOne).not.to.equal(subjectAtLevelZero); }); }) }); describe('when calling .addSubject()', function(){ var kingdom; var smallParams = { element: 'div', subjects:[] }; var fromRoot = { element:'', subjects:[smallParams] } describe('using good data', function(){ beforeEach(function() { kingdom = new Kingdom(); }); describe("with makeLord = false", function(){ it("should add child to the root without updating current node", function() { kingdom.addSubject(smallParams); expect(kingdom.delegateLord).to.eql(fromRoot); }); }); describe("with makeLord = true", function(){ it("should add child to the root and become current node", function() { kingdom.addSubject(smallParams, true); expect(kingdom.delegateLord).to.eql(smallParams); }); }); describe("with the subject === {}", function(){ it("it will add {subjects: []} as a child", function() { kingdom.addSubject({}); expect(kingdom.delegateLord.subjects[0]).to.eql({subjects: []}); }); }); describe("multiple times (5x)", function(){ it("there should be 5 subjects", function() { kingdom .addSubject(smallParams) .addSubject(smallParams) .addSubject(smallParams) .addSubject(smallParams) .addSubject(smallParams); expect(kingdom.delegateLord.subjects.length).to.equal(5); }); }); }); describe('using bad data', function(){ beforeEach(function() { kingdom = new Kingdom(); }); describe("with subject === undefined", function(){ it("should through an error", function() { expect(function(){ kingdom.addSubject(); }).to.throw(); }); }); describe("with an subject === array && makeLord === true", function(){ it("should through an error", function() { expect(function(){ kingdom.addSubject(null, true); }).to.throw(); }); }); }); }); describe('when calling .makeSubjectLordAtIndex()', function(){ var kingdom; beforeEach(function() { kingdom = new Kingdom(getParams()); }); it("the current node will stay the same when the index === 3 out of bounds ", function() { var before = kingdom.delegateLord; var after = kingdom.makeSubjectLordAtIndex(3).delegateLord; expect(before).to.eql(after); }); it("the current node will change to item 3 when index === 2", function() { var after = kingdom.makeSubjectLordAtIndex(2).delegateLord expect(after).to.eql(getParams().subjects[2]); }); it("the current node will change to item 2 when index === '1'", function() { var after = kingdom.makeSubjectLordAtIndex('1').delegateLord expect(after).to.eql(getParams().subjects[1]); }); it("should throw error when given an array", function(){ expect(function(){ kingdom.makeSubjectLordAtIndex(['king']) }).to.throw(); }); it("should throw error when given an object", function(){ expect(function(){ kingdom.makeSubjectLordAtIndex({ play: 'king'}) }).to.throw(); }); it("should throw error when given an non number string", function(){ expect(function(){ kingdom.makeSubjectLordAtIndex('subjects') }).to.throw(); }); }) describe('when calling .banishSubjectAtIndex()', function(){ var kingdom; beforeEach(function() { kingdom = new Kingdom(getParams()); }); it("return false when empty ", function() { kingdom = new Kingdom(); var response = kingdom.banishSubjectAtIndex(0); expect(response).to.be.false; }); it("return true when child exists at index 2 ", function() { var goingToDelete = kingdom.delegateLord.subjects[2]; var response = kingdom.banishSubjectAtIndex(2); expect(response).to.be.true; expect(kingdom.delegateLord.subjects).not.to.include(goingToDelete) }); it("return true when child exists @ index === '1'", function() { var goingToDelete = kingdom.delegateLord.subjects[1]; var response = kingdom.banishSubjectAtIndex('1'); expect(response).to.be.true; expect(kingdom.delegateLord.subjects).not.to.include(goingToDelete) }); it("return false when index === []", function() { expect(function(){ var response = kingdom.banishSubjectAtIndex([]); }).to.throw() }); it("return false when index === {}", function() { expect(function(){ var response = kingdom.banishSubjectAtIndex({}); }).to.throw() }); }); describe('when calling .banishSubjectsForCurrentLord()', function(){ var kingdom; beforeEach(function() { kingdom = new Kingdom(getParams()); }); it("subjects remain empty when empty ", function() { kingdom = new Kingdom(); kingdom.banishSubjectsForCurrentLord(); expect(kingdom.delegateLord.subjects).to.eql([]); }); it("subjects become empty when current node at root and subjects exists", function() { var response = kingdom.banishSubjectsForCurrentLord(); expect(kingdom.delegateLord.subjects).to.eql([]) }); it("subjects become empty when current node at root and subjects exists", function() { var before = kingdom.delegateLord; kingdom.banishSubjectsForCurrentLord(); before.subjects = []; expect(kingdom.delegateLord.subjects).to.eql([]); expect(kingdom.delegateLord).to.eql(before) }); }); describe('when calling .destroyKingdom()', function(){ var kingdom; var root = {element:'', subjects: []}; beforeEach(function() { kingdom = new Kingdom(getParams()); }); it("nothing happens when kingdom is empty", function() { kingdom = new Kingdom(); var before = kingdom.delegateLord; kingdom.destroyKingdom(); var after = kingdom.delegateLord; expect(before).to.eql(after); }); it("everything is destroyed and current node stays at root", function() { var response = kingdom.destroyKingdom(); var newKingdom = new Kingdom(); expect(kingdom.delegateLord).to.eql(root) expect(kingdom.delegateLord).to.eql(newKingdom.delegateLord) }); it("Everything is destroyed and current node goes to root when 2 levels deep", function() { var before = kingdom .makeSubjectLordAtIndex(2) .makeSubjectLordAtIndex(0) .delegateLord; var newKingdom = new Kingdom(); kingdom.destroyKingdom(); expect(before).not.to.equal(kingdom.delegateLord); expect(kingdom.delegateLord).to.eql(newKingdom.delegateLord) }); }); describe('when calling .buildKingdom()', function(){ var kingdom; var root = {element:'', subjects: []}; var outer, inner; beforeEach(function() { kingdom = new Kingdom(); kingdom .addSubject({ element: 'div', textAsHTML: ' awesome ', properties:{ className:'good', id:'times' } }, true) .addSubject({ element:'span', textAsString: 'nice' }); var frag = document.createDocumentFragment() var d = document.createElement('div') var e = document.createElement('span') e.innerText = 'nice' d.className = 'good'; d.id = 'times' d.innerHTML = ' awesome nice ' frag.appendChild(d); }); it("return empty document fragment when empty", function() { kingdom = new Kingdom(); var frag = kingdom.buildKingdom(); expect(frag).to.eql(document.createDocumentFragment()); }); }); });