describe('gdjs.LinksManager', function () {
  var runtimeGame = new gdjs.RuntimeGame({
    variables: [],
    properties: { windowWidth: 800, windowHeight: 600 },
    resources: { resources: [] },
  });
  var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
  runtimeScene.loadFromScene({
    layers: [{ name: '', visibility: true, effects: [] }],
    variables: [],
    behaviorsSharedData: [],
    objects: [],
    instances: [],
  });

  var manager = gdjs.LinksManager.getManager(runtimeScene);

  var object1A = new gdjs.RuntimeObject(runtimeScene, {
    name: 'obj1',
    type: '',
    behaviors: [],
  });
  var object1B = new gdjs.RuntimeObject(runtimeScene, {
    name: 'obj1',
    type: '',
    behaviors: [],
  });
  var object1C = new gdjs.RuntimeObject(runtimeScene, {
    name: 'obj1',
    type: '',
    behaviors: [],
  });

  var object2A = new gdjs.RuntimeObject(runtimeScene, {
    name: 'obj1',
    type: '',
    behaviors: [],
  });
  var object2B = new gdjs.RuntimeObject(runtimeScene, {
    name: 'obj1',
    type: '',
    behaviors: [],
  });
  var object2C = new gdjs.RuntimeObject(runtimeScene, {
    name: 'obj1',
    type: '',
    behaviors: [],
  });

  runtimeScene.addObject(object1A);
  runtimeScene.addObject(object1B);
  runtimeScene.addObject(object1C);

  runtimeScene.addObject(object2A);
  runtimeScene.addObject(object2B);
  runtimeScene.addObject(object2C);

  it('can link two objects', function () {
    manager.linkObjects(object1A, object2A);

    var linkedObjects = manager.getObjectsLinkedWith(object1A);
    expect(linkedObjects.length).to.be(1);
    expect(linkedObjects[0]).to.be(object2A);

    linkedObjects = manager.getObjectsLinkedWith(object2A);
    expect(linkedObjects.length).to.be(1);
    expect(linkedObjects[0]).to.be(object1A);
  });
  it('can link more objects', function () {
    manager.linkObjects(object1A, object2A); //Including the same objects as before
    manager.linkObjects(object1A, object2B);
    manager.linkObjects(object1A, object2C);

    var linkedObjects = manager.getObjectsLinkedWith(object1A);
    expect(linkedObjects.length).to.be(3);

    linkedObjects = manager.getObjectsLinkedWith(object2C);
    expect(linkedObjects.length).to.be(1);
    expect(linkedObjects[0]).to.be(object1A);
  });
  it('supports removing links', function () {
    manager.removeLinkBetween(object1A, object2B);
    var linkedObjects = manager.getObjectsLinkedWith(object1A);
    expect(linkedObjects.length).to.be(2);

    manager.linkObjects(object2B, object2C);
    manager.removeAllLinksOf(object1A);
    manager.removeAllLinksOf(object1A);

    linkedObjects = manager.getObjectsLinkedWith(object1A);
    expect(linkedObjects.length).to.be(0);

    linkedObjects = manager.getObjectsLinkedWith(object2A);
    expect(linkedObjects.length).to.be(0);

    linkedObjects = manager.getObjectsLinkedWith(object2C);
    expect(linkedObjects.length).to.be(1);
    expect(linkedObjects[0]).to.be(object2B);
  });
});
