diff --git a/platform/framework/test/register/ExtensionRegistrarSpec.js b/platform/framework/test/register/ExtensionRegistrarSpec.js index 70811c09f4..c89417da4b 100644 --- a/platform/framework/test/register/ExtensionRegistrarSpec.js +++ b/platform/framework/test/register/ExtensionRegistrarSpec.js @@ -11,14 +11,24 @@ define( describe("The extension registrar", function () { var mockApp, mockLog, + mockSorter, customRegistrars, registrar; beforeEach(function () { mockApp = jasmine.createSpyObj("app", ["factory"]); mockLog = jasmine.createSpyObj("$log", ["error", "warn", "debug", "info"]); + mockSorter = jasmine.createSpyObj("sorter", ["sort"]); customRegistrars = {}; - registrar = new ExtensionRegistrar(mockApp, customRegistrars, mockLog); + + mockSorter.sort.andCallFake(function (v) { return v; }); + + registrar = new ExtensionRegistrar( + mockApp, + customRegistrars, + mockSorter, + mockLog + ); }); it("registers extensions using the factory", function () { @@ -64,6 +74,23 @@ define( expect(customRegistrars.things).toHaveBeenCalled(); }); + it("sorts extensions before registering", function () { + // Some extension definitions to sort + var a = { a: 'a' }, b = { b: 'b' }, c = { c: 'c' }; + + // Fake sorting; just reverse the array + mockSorter.sort.andCallFake(function (v) { return v.reverse(); }); + + // Register the extensions + registrar.registerExtensions({ things: [ a, b, c ] }); + + // Verify registration interactions occurred in reverse-order + [ c, b, a ].forEach(function (extension, index) { + expect(mockApp.factory.calls[index].args[1][0]()) + .toEqual(extension); + }); + }); + }); } ); \ No newline at end of file diff --git a/platform/framework/test/register/ExtensionSorterSpec.js b/platform/framework/test/register/ExtensionSorterSpec.js new file mode 100644 index 0000000000..a51ece21eb --- /dev/null +++ b/platform/framework/test/register/ExtensionSorterSpec.js @@ -0,0 +1,50 @@ +/*global define,Promise,describe,it,expect,beforeEach,jasmine,waitsFor*/ + +define( + ["../../src/register/ExtensionSorter"], + function (ExtensionSorter) { + "use strict"; + + describe("The extension sorter", function () { + var mockLog, + sorter; + + beforeEach(function () { + mockLog = jasmine.createSpyObj( + "$log", + ["error", "warn", "debug", "info"] + ); + + sorter = new ExtensionSorter(mockLog); + }); + + it("sorts extensions in priority order", function () { + var a = { priority: 10 }, + b = {}, + c = { priority: 'mandatory' }; // Should be +Inf + expect(sorter.sort([a, b, c])).toEqual([c, a, b]); + }); + + it("warns about unrecognized priorities", function () { + var a = { priority: 10 }, + b = {}, + c = { priority: 'mandatory' }, // Should be +Inf + d = { priority: 'GARBAGE-TEXT' }, + e = { priority: { mal: "formed"} }, + f = { priority: 3 }; + + // Sorting should use default order (note we assume + // a stable sort here as well) + expect(sorter.sort( + [a, b, c, d, e, f] + )).toEqual( + [c, a, f, b, d, e] + ); + + // Should have been warned exactly twice (for d & e) + expect(mockLog.warn.calls.length).toEqual(2); + }); + + }); + } +); diff --git a/platform/framework/test/suite.json b/platform/framework/test/suite.json index a46a4ecfe7..93504f01af 100644 --- a/platform/framework/test/suite.json +++ b/platform/framework/test/suite.json @@ -6,6 +6,7 @@ "load/Extension", "register/CustomRegistrars", "register/ExtensionRegistrar", + "register/ExtensionSorter", "register/PartialConstructor", "register/ServiceCompositor", "resolve/BundleResolver",