exports["test start / stop ports"] = assert => {
  const input = new InputPort({ id: Date.now().toString(32), initial: {data:0} });
  const topic = input.topic;

  assert.ok(topic.includes(addonID), "topics are namespaced to add-on");

  const xs = lift(({data}) => "x:" + data, input);
  const ys = lift(({data}) => "y:" + data, input);

  assert.deepEqual(input.value, {data:0}, "initila value is set");
  assert.deepEqual(xs.value, "x:0", "initial value is mapped");
  assert.deepEqual(ys.value, "y:0", "initial value is mapped");

  notifyObservers(message(1), topic, null);

  assert.deepEqual(input.value, {data:0}, "no message received on input port");
  assert.deepEqual(xs.value, "x:0", "no message received on xs");
  assert.deepEqual(ys.value, "y:0", "no message received on ys");

  start(xs);


  notifyObservers(message(2), topic, null);

  assert.deepEqual(input.value, {data:2}, "message received on input port");
  assert.deepEqual(xs.value, "x:2", "message received on xs");
  assert.deepEqual(ys.value, "y:2", "no message received on (not started) ys");


  notifyObservers(message(3), topic, null);


  assert.deepEqual(input.value, {data:3}, "message received on input port");
  assert.deepEqual(xs.value, "x:3", "message received on xs");
  assert.deepEqual(ys.value, "y:3", "message received on ys");


  notifyObservers(message(4), topic, null);

  assert.deepEqual(input.value, {data:4}, "message received on input port");
  assert.deepEqual(xs.value, "x:4", "message not received on (stopped) xs");
  assert.deepEqual(ys.value, "y:4", "message received on ys");


  stop(input);

  notifyObservers(message(5), topic, null);

  assert.deepEqual(input.value, {data:4}, "message note received on input port");
  assert.deepEqual(xs.value, "x:4", "message not received on (stopped) xs");
  assert.deepEqual(ys.value, "y:4", "message not received on (stopped) ys");
};
exports["test receive what was send"] = assert => {
  const id = Date.now().toString(32);
  const input = new InputPort({ id: id, initial: 0});
  const output = new OutputPort({ id: id, sync: true });

  assert.ok(input.topic.includes(addonID),
            "input topic is namespaced to addon");
  assert.equal(input.topic, output.topic,
              "input & output get same topics from id.");

  start(input);

  assert.equal(input.value, 0, "initial value is set");

  send(output, { data: 1 });
  assert.deepEqual(input.value, {data: 1}, "message unwrapped");

  send(output, []);
  assert.deepEqual(input.value, [], "array message unwrapped");

  send(output, null);
  assert.deepEqual(input.value, null, "null message received");

  send(output, new String("message"));
  assert.deepEqual(input.value, new String("message"),
                   "string instance received");

  send(output, /pattern/);
  assert.deepEqual(input.value, /pattern/, "regexp received");

  assert.throws(() => send(output, "hi"),
                /Unsupproted message type: `string`/,
                "strings can't be send");

  assert.throws(() => send(output, 4),
                /Unsupproted message type: `number`/,
                "numbers can't be send");

  assert.throws(() => send(output, void(0)),
                /Unsupproted message type: `undefined`/,
                "undefineds can't be send");

  assert.throws(() => send(output, true),
                /Unsupproted message type: `boolean`/,
                "booleans can't be send");

  stop(input);
};