QUnit.module('select2(val)');

var Utils = require('select2/utils');

QUnit.test('multiple elements with arguments works', function (assert) {
  var $ = require('jquery');
  require('jquery.select2');

  var $first = $(
    '<select>' +
      '<option>1</option>' +
      '<option>2</option>' +
    '</select>'
  );
  var $second = $first.clone();

  var $both = $first.add($second);
  $both.select2();

  $both.select2('val', '2');

  assert.equal(
    $first.val(),
    '2',
    'The call should change the value on the first element'
  );
  assert.equal(
    $second.val(),
    '2',
    'The call should also change the value on the second element'
  );
});

QUnit.test('initializes when jQuery $.data contains' +
  ' cyclic reference', function (assert) {
  var $ = require('jquery');
  require('jquery.select2');

  var $select = $(
    '<select>' +
      '<option>One</option>' +
      '<option>Two</option>' +
      '<option value="3" selected>Three</option>' +
    '</select>'
  );

  // Add a circular reference object using jQuery.
  var recursiveObject = {};

  recursiveObject.same =  recursiveObject;

  $select.data('same', recursiveObject);

  $select.select2();

  assert.equal(
    $select.val(),
    '3',
    'The option value should be pulled correctly'
  );
});

QUnit.test('$element.data returns instance and options correctly',
  function (assert) {
  var $ = require('jquery');
  require('jquery.select2');

  var $select = $(
  '<select>' +
    '<option value="1">One</option>' +
    '<option value="2">Two</option>' +
    '<option value="3" selected>Three</option>' +
  '</select>'
  );
  
  // Initialize.
  $select.select2({maximumSelectionLength: 2, multiple: true});
  
  assert.equal(
    $select.val(),
    '3',
    'Only 1 option should be pulled.'
  );

  // Try to resolve instance via .data('select2').
  var $instance = $select.data('select2'); 
  assert.ok($instance);
  assert.ok($instance.options);

  // Ensure $select.data('select2') is the same instance 
  // created by .select2()   
  assert.equal($instance, Utils.GetData($instance.$element[0], 
               'select2'));
   
  // Ensure initialized property matches.
  assert.equal($instance.options.options.maximumSelectionLength,
               2);
});
