describe('stacked map', function() {
  var stackedMap;

  beforeEach(module('ui.bootstrap.modal'));
  beforeEach(inject(function ($$stackedMap) {
    stackedMap = $$stackedMap.createNew();
  }));

  it('should add and remove objects by key', function() {
    stackedMap.add('foo', 'foo_value');
    expect(stackedMap.length()).toEqual(1);
    expect(stackedMap.get('foo').key).toEqual('foo');
    expect(stackedMap.get('foo').value).toEqual('foo_value');

    stackedMap.remove('foo');
    expect(stackedMap.length()).toEqual(0);
    expect(stackedMap.get('foo')).toBeUndefined();
  });

  it('should support listing keys', function() {
    stackedMap.add('foo', 'foo_value');
    stackedMap.add('bar', 'bar_value');

    expect(stackedMap.keys()).toEqual(['foo', 'bar']);
  });

  it('should get topmost element', function() {
    stackedMap.add('foo', 'foo_value');
    stackedMap.add('bar', 'bar_value');
    expect(stackedMap.length()).toEqual(2);

    expect(stackedMap.top().key).toEqual('bar');
    expect(stackedMap.length()).toEqual(2);
  });

  it('should remove topmost element', function() {
    stackedMap.add('foo', 'foo_value');
    stackedMap.add('bar', 'bar_value');

    expect(stackedMap.removeTop().key).toEqual('bar');
    expect(stackedMap.removeTop().key).toEqual('foo');
  });

  it('should preserve semantic of an empty stackedMap', function() {
    expect(stackedMap.length()).toEqual(0);
    expect(stackedMap.top()).toBeUndefined();
  });

  it('should ignore removal of non-existing elements', function() {
    expect(stackedMap.remove('non-existing')).toBeUndefined();
  });
});
