// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2011 Strobe Inc. and contributors. // Portions ©2008-2011 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ==========================================================================

/*global module test equals context ok same */

var context = null;

// .….….….….….….….….….….….….….….. // classes() // module(“SC.RenderContext#classes”, {

setup: function() {
  context = SC.RenderContext() ;
}

});

test(“returns empty array if no current class names”, function() {

same(context.classes(), [], 'classes') ;

});

test(“addClass(array) updates class names”, function() {

var cl = 'bar baz'.w();
equals(context.addClass(cl), context, "returns receiver");
same(context.classes(), cl, 'class names');

});

test(“returns classes if set”, function() {

context.addClass('bar');
same(context.classes(), ['bar'], 'classNames');

});

test(“clone on retrieval if addClass(array) set”, function() {

var cl = 'foo bar'.w();
context.addClass(cl);

var result = context.classes();
ok(result !== cl, "class name is NOT same instance");
same(result, cl, "but arrays are equivalent");

equals(result, context.classes(), "2nd retrieval is same instance");

});

test(“extracts class names from element on first retrieval”, function() {

var elem = document.createElement('div');
SC.$(elem).attr('class', 'foo bar');
context = SC.RenderContext(elem);

var result = context.classes();
same(result, ['foo', 'bar'], 'extracted class names');

});

// .….….….….….….….….….….….….….….. // hasClass() // module(“SC.RenderContext#hasClass”, {

setup: function() {
  context = SC.RenderContext().addClass('foo bar'.w()) ;
}

});

test(“should return true if context classNames has class name”, function() {

equals(YES, context.hasClass('foo'), 'should have foo');

});

test(“should return false if context classNames does not have class name”, function() {

equals(NO, context.hasClass('imaginary'), "should not have imaginary");

});

test(“should return false if context has no classNames”, function() {

context = context.begin('div');
ok(context.classes().length === 0, 'precondition - context has no classNames');
equals(NO, context.hasClass('foo'), 'should not have foo');

});

// .….….….….….….….….….….….….….….. // addClass() // module(“SC.RenderContext#addClass”, {

setup: function() {
  context = SC.RenderContext().addClass('foo') ;
}

});

test(“should return receiver”, function() {

equals(context.addClass('foo'), context, "receiver");

});

test(“should add class name to existing classNames array on currentTag”, function() {

context.addClass('bar');
same(context.classes(), ['foo', 'bar'], 'has classes');
equals(context._classesDidChange, YES, "note did change");

});

test(“should only add class name once - does nothing if name already in array”, function() {

same(context.classes(), ['foo'], 'precondition - has foo classname');
context._classesDidChange = NO; // reset  to pretend once not modified

context.addClass('foo');
same(context.classes(), ['foo'], 'no change');
equals(context._classesDidChange, NO, "note did not change");

});

// .….….….….….….….….….….….….….….. // removeClass() // module(“SC.RenderContext#removeClass”, {

setup: function() {
  context = SC.RenderContext().addClass(['foo', 'bar']) ;
}

});

test(“should remove class if already in classNames array”, function() {

ok(context.classes().indexOf('foo')>=0, "precondition - has foo");

context.removeClass('foo');
ok(context.classes().indexOf('foo')<0, "does not have foo");

});

test('should return receiver', function() {

equals(context.removeClass('foo'), context, 'receiver');

});

test(“should do nothing if class name not in array”, function() {

context._classesDidChange = NO; // reset to pretend not modified
context.removeClass('imaginary');
same(context.classes(), 'foo bar'.w(), 'did not change');
equals(context._classesDidChange, NO, "note did not change");

});

test(“should do nothing if there are no class names”, function() {

context = context.begin();
same(context.classes(), [], 'precondition - no class names');
context._classesDidChange = NO; // reset to pretend not modified

context.removeClass('foo');
same(context.classes(), [], 'still no class names -- and no errors');
equals(context._classesDidChange, NO, "note did not change");

});

// .….….….….….….….….….….….….….….. // setClass // module(“SC.RenderContext#setClass”, {

setup: function() {
  context = SC.RenderContext().addClass('foo') ;
}

});

test(“should add named class if shouldAdd is YES”, function() {

ok(!context.hasClass("bar"), "precondition - does not have class bar");
context.setClass("bar", YES);
ok(context.hasClass("bar"), "now has bar");

});

test(“should remove named class if shouldAdd is NO”, function() {

ok(context.hasClass("foo"), "precondition - has class foo");
context.setClass("foo", NO);
ok(!context.hasClass("foo"), "should not have foo ");

});

test(“should return receiver”, function() {

equals(context, context.setClass("bar", YES), "returns receiver");

});

test(“should add/remove all classes if a hash of class names is passed”, function() {

ok(context.hasClass("foo"), "precondition - has class foo");
ok(!context.hasClass("bar"), "precondition - does not have class bar");

context.setClass({ foo: NO, bar: YES });

ok(context.hasClass("bar"), "now has bar");
ok(!context.hasClass("foo"), "should not have foo ");

});