aboutsummaryrefslogtreecommitdiff
path: root/tools/addon-sdk-1.5/packages/api-utils/tests/test-registry.js
blob: c5820fbfb71b9211e27653a8449d3a9df3ccde93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

'use strict';

exports['test:add'] = function(test) {
  function Class() {}
  let fixture = require('utils/registry').Registry(Class);
  let isAddEmitted = false;
  fixture.on('add', function(item) {
    test.assert(
      item instanceof Class,
      'if object added is not an instance should construct instance from it'
    );
    test.assert(
      fixture.has(item),
      'callback is called after instance is added'
    );
    test.assert(
      !isAddEmitted,
      'callback should be called for the same item only once'
    );
    isAddEmitted = true;
  });

  let object = fixture.add({});
  fixture.add(object);
};

exports['test:remove'] = function(test) {
  function Class() {}
  let fixture = require('utils/registry').Registry(Class);
  fixture.on('remove', function(item) {
     test.assert(
      item instanceof Class,
      'if object removed can be only instance of Class'
    );
    test.assert(
      fixture.has(item),
      'callback is called before instance is removed'
    );
    test.assert(
      !isRemoveEmitted,
      'callback should be called for the same item only once'
    );
    isRemoveEmitted = true;
  });

  fixture.remove({});
  let object = fixture.add({});
  fixture.remove(object);
  fixture.remove(object);
};

exports['test:items'] = function(test) {
  function Class() {}
  let fixture = require('utils/registry').Registry(Class),
      actual,
      times = 0;

  function testItem(item) {
    times ++;
    test.assertEqual(
      actual,
      item,
      'item should match actual item being added/removed'
    );
  }
  
  actual = fixture.add({});

  fixture.on('add', testItem);
  fixture.on('remove', testItem);
  
  fixture.remove(actual);
  fixture.remove(fixture.add(actual = new Class()));
  test.assertEqual(3, times, 'should notify listeners on each call');
}