/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var lazyLoading = require('utils/lazy_loading'); describe('lazy_loading', function () { describe('#run()', function () { var context = Em.Object.create({isLoaded: false}); var options = { destination: [], source: [{'test':'test'}], context: context }; it('load one item', function () { lazyLoading.run(options); expect(options.destination[0]).to.eql(options.source[0]); expect(context.get('isLoaded')).to.equal(true); }); var testsInfo = [ { title: 'load 11 item with initSize - 11', result: true, initSize: 11, destinationLength: 11, destination: [], source: [{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}], context: Em.Object.create() }, { title: 'load 11 item with initSize - 12', result: true, initSize: 12, destinationLength: 11, destination: [], source: [{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}], context: Em.Object.create() }, {//items will be completely loaded on next iteration of pushing chunk title: 'load 11 item with initSize - 10', result: false, initSize: 10, destinationLength: 10, destination: [], source: [{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}], context: Em.Object.create({isLoaded: false}) } ]; testsInfo.forEach(function(test){ it(test.title, function () { lazyLoading.run(test); expect(test.destinationLength).to.equal(test.destination.length); expect(test.context.get('isLoaded')).to.equal(test.result); }); }); }); describe('#divideIntoChunks()', function () { var testsInfo = [ { title: 'load 11 item with chunkSize - 3', chunkSize: 3, source: [{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}], chunks: [[{i:1}, {i:2}, {i:3}], [{i:4}, {i:5}, {i:6}], [{i:7}, {i:8}, {i:9}], [{i:10},{i:11}]] }, { title: 'load 11 item with chunkSize - 0', chunkSize: 0, source: [{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}], chunks: [[{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}]] }, { title: 'load 11 item with chunkSize - 1', chunkSize: 1, source: [{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}], chunks: [[{i:1}], [{i:2}], [{i:3}], [{i:4}], [{i:5}], [{i:6}], [{i:7}], [{i:8}], [{i:9}], [{i:10}], [{i:11}]] }, { title: 'load 11 item with chunkSize - 11', chunkSize: 0, source: [{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}], chunks: [[{i:1}, {i:2}, {i:3}, {i:4}, {i:5}, {i:6}, {i:7}, {i:8}, {i:9}, {i:10},{i:11}]] } ]; testsInfo.forEach(function(test){ it(test.title, function () { var chunks = lazyLoading.divideIntoChunks(test.source, test.chunkSize); expect(chunks).to.eql(test.chunks); }); }); }); describe("#pushChunk()", function() { beforeEach(function () { this.clock = sinon.useFakeTimers(); sinon.spy(lazyLoading, 'pushChunk'); }); afterEach(function () { this.clock.restore(); lazyLoading.pushChunk.restore(); }); it("last chunk", function() { this.clock = sinon.useFakeTimers(); var destination = [], chunks = [[1]], context = Em.Object.create(), instance = { context: context, timeoutRef: null, terminate: Em.K }; lazyLoading.pushChunk(chunks, 0, 10, destination, instance); this.clock.tick(10); expect(destination[0]).to.equal(1); expect(context.get('isLoaded')).to.be.true; expect(lazyLoading.pushChunk.calledTwice).to.be.false; }); it("two chunks", function() { this.clock = sinon.useFakeTimers(); var destination = [], chunks = [[1], [2]], context = Em.Object.create(), instance = { context: context, timeoutRef: null, terminate: Em.K }; lazyLoading.pushChunk(chunks, 0, 10, destination, instance); this.clock.tick(20); expect(destination.length).to.equal(2); expect(context.get('isLoaded')).to.be.true; expect(lazyLoading.pushChunk.calledTwice).to.be.true; }); it("terminated chunks", function() { this.clock = sinon.useFakeTimers(); var destination = [], chunks = [[1]], context = Em.Object.create({isLoaded: false}), instance = { context: context, timeoutRef: null, terminate: Em.K }; lazyLoading.pushChunk(chunks, 0, 10, destination, instance); clearTimeout(instance.timeoutRef); this.clock.tick(10); expect(destination.length).to.empty; expect(context.get('isLoaded')).to.be.false; expect(lazyLoading.pushChunk.calledTwice).to.be.false; }); }); describe("#terminate()", function() { before(function () { sinon.spy(lazyLoading, 'pushChunk'); this.clock = sinon.useFakeTimers(); }); after(function () { lazyLoading.pushChunk.restore(); this.clock.restore(); }); it("loading terminated", function() { var context = Em.Object.create({isLoaded: false}); var options = { destination: [], source: [1, 2], delay: 10, chunkSize: 1, initSize: 1, context: context }; var ll = lazyLoading.run(options); lazyLoading.terminate(ll); this.clock.tick(10); expect(options.destination.length).to.equal(1); expect(context.get('isLoaded')).to.be.false; expect(lazyLoading.pushChunk.calledTwice).to.be.false; }); }); });