<!DOCTYPE html>
<!--
Copyright (c) 2013 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<link rel="import" href="/base/extension_registry.html">
<script>
'use strict';

tr.b.unittest.testSuite(function() {
  test('tberSimpleNamedRegistration', function() {
    function DummyEvent() {
    }
    DummyEvent.prototype = {
    };

    function DummyEventSubclass() {
    }
    DummyEventSubclass.prototype = {
      __proto__: DummyEvent.prototype
    };

    var options = new tr.b.ExtensionRegistryOptions(
        tr.b.TYPE_BASED_REGISTRY_MODE);
    options.mandatoryBaseClass = DummyEvent;
    options.defaultConstructor = DummyEvent;
    tr.b.decorateExtensionRegistry(
        DummyEvent, options);

    DummyEvent.register(DummyEventSubclass, {typeName: 'dummy-name'});
    assert.equal(DummyEvent, DummyEvent.getConstructor('cat', 'name'));
    assert.equal(DummyEvent.getConstructor('dummy', 'dummy-name'),
                 DummyEventSubclass);
    DummyEvent.unregister(DummyEventSubclass);
    assert.equal(DummyEvent, DummyEvent.getConstructor('dummy', 'dummy-name'));
  });

  test('tberSimpleCategoryRegistration', function() {
    function DummyEvent() {
    }
    DummyEvent.prototype = {
    };

    function DummyEventSubclass() {
    }
    DummyEventSubclass.prototype = {
      __proto__: DummyEvent.prototype
    };

    var options = new tr.b.ExtensionRegistryOptions(
        tr.b.TYPE_BASED_REGISTRY_MODE);
    options.mandatoryBaseClass = DummyEvent;
    options.defaultConstructor = DummyEvent;
    tr.b.decorateExtensionRegistry(
        DummyEvent, options);

    DummyEvent.register(
      DummyEventSubclass,
      {categoryParts: ['dummy']
    });
    assert.equal(DummyEvent, DummyEvent.getConstructor('cat', 'name'));
    assert.equal(DummyEvent.getConstructor('dummy', 'dummy-name'),
                 DummyEventSubclass);
    DummyEvent.unregister(DummyEventSubclass);
    assert.equal(DummyEvent, DummyEvent.getConstructor('dummy', 'dummy-name'));
  });

  test('tberSimpleCompoundCategory', function() {
    function DummyEvent() {
    }
    DummyEvent.prototype = {
    };

    function DummyEventSubclass() {
    }
    DummyEventSubclass.prototype = {
      __proto__: DummyEvent.prototype
    };

    var options = new tr.b.ExtensionRegistryOptions(
        tr.b.TYPE_BASED_REGISTRY_MODE);
    options.mandatoryBaseClass = DummyEvent;
    options.defaultConstructor = DummyEvent;
    tr.b.decorateExtensionRegistry(
        DummyEvent, options);

    DummyEvent.register(
        DummyEventSubclass,
        {
          categoryParts: ['dummy']
        });
    assert.equal(DummyEvent, DummyEvent.getConstructor('cat', 'name'));
    assert.equal(DummyEventSubclass,
                 DummyEvent.getConstructor('dummy,something-else',
                                           'dummy-name'));
  });

  test('tberDefaultType', function() {
    function DummyEvent() {
    }
    DummyEvent.prototype = {
    };

    function DummyEventSubclass() {
    }
    DummyEventSubclass.prototype = {
      __proto__: DummyEvent.prototype
    };

    var options = new tr.b.ExtensionRegistryOptions(
        tr.b.TYPE_BASED_REGISTRY_MODE);
    options.mandatoryBaseClass = DummyEvent;
    options.defaultConstructor = DummyEvent;
    tr.b.decorateExtensionRegistry(
        DummyEvent, options);

    DummyEvent.register(
        DummyEventSubclass,
        {
          categoryParts: ['dummy']
        });
    assert.equal(DummyEvent, DummyEvent.getConstructor('cat', 'name'));
    assert.equal(DummyEventSubclass,
                 DummyEvent.getConstructor('dummy,something-else',
                                           'dummy-name'));
  });


});
</script>
