describe(“ReportDispatcher”, function() {

it("builds an interface of requested methods", function() {
  var dispatcher = new j$.ReportDispatcher(['foo', 'bar', 'baz']);

  expect(dispatcher.foo).toBeDefined();
  expect(dispatcher.bar).toBeDefined();
  expect(dispatcher.baz).toBeDefined();
});

it("dispatches requested methods to added reporters", function() {
  var dispatcher = new j$.ReportDispatcher(['foo', 'bar']),
    reporter = jasmine.createSpyObj('reporter', ['foo', 'bar']),
    anotherReporter = jasmine.createSpyObj('reporter', ['foo', 'bar']);

  dispatcher.addReporter(reporter);
  dispatcher.addReporter(anotherReporter);

  dispatcher.foo(123, 456);

  expect(reporter.foo).toHaveBeenCalledWith(123, 456);
  expect(anotherReporter.foo).toHaveBeenCalledWith(123, 456);

  dispatcher.bar('a', 'b');

  expect(reporter.bar).toHaveBeenCalledWith('a', 'b');
  expect(anotherReporter.bar).toHaveBeenCalledWith('a', 'b');
});

it("does not dispatch to a reporter if the reporter doesn't accept the method", function() {
  var dispatcher = new j$.ReportDispatcher(['foo']),
    reporter = jasmine.createSpyObj('reporter', ['baz']);

  dispatcher.addReporter(reporter);

  expect(function() {
    dispatcher.foo(123, 456);
  }).not.toThrow();
});

});