// ========================================================================== // Project: SproutCore
- JavaScript Application Framework // Copyright: ©2006-2011 Apple Inc. and contributors. // License: Licensed under MIT license (see license.js) // ==========================================================================
/*global module test equals context ok same */
// .….….….….….….….….….….….….…… // render() // module(“SC.View#render”);
test(“default implementation invokes renderChildViews if firstTime = YES”, function() {
var rendered = 0, updated = 0, parentRendered = 0, parentUpdated = 0 ; var view = SC.View.create({ displayProperties: ["triggerRenderProperty"], childViews: ["child"], render: function(context) { parentRendered++; }, update: function(jquery) { parentUpdated++; }, child: SC.View.create({ render: function(context) { rendered++; }, update: function(jquery) { updated++; } }) }); view.createLayer(); equals(rendered, 1, 'rendered the child'); equals(parentRendered, 1); view.updateLayer(true); equals(rendered, 1, 'didn\'t call render again'); equals(parentRendered, 1, 'didn\'t call the parent\'s render again'); equals(parentUpdated, 1, 'called the parent\'s update'); equals(updated, 0, 'didn\'t call the child\'s update'); // Clean up. view.destroy();
});
test(“default implementation does not invoke renderChildViews if explicitly rendered in render method”, function() {
var rendered = 0, updated = 0, parentRendered = 0, parentUpdated = 0 ; var view = SC.View.create({ displayProperties: ["triggerRenderProperty"], childViews: ["child"], render: function(context) { this.renderChildViews(context); parentRendered++; }, update: function(jquery) { parentUpdated++; }, child: SC.View.create({ render: function(context) { rendered++; }, update: function(jquery) { updated++; } }) }); view.createLayer(); equals(rendered, 1, 'rendered the child once'); equals(parentRendered, 1); equals(view.$('div').length, 1); view.updateLayer(true); equals(rendered, 1, 'didn\'t call render again'); equals(parentRendered, 1, 'didn\'t call the parent\'s render again'); equals(parentUpdated, 1, 'called the parent\'s update'); equals(updated, 0, 'didn\'t call the child\'s update'); // Clean up. view.destroy();
});
test(“should invoke renderChildViews if layer is destroyed then re-rendered”, function() {
var rendered = 0, updated = 0, parentRendered = 0, parentUpdated = 0 ; var view = SC.View.create({ displayProperties: ["triggerRenderProperty"], childViews: ["child"], render: function(context) { parentRendered++; }, update: function(jquery) { parentUpdated++; }, child: SC.View.create({ render: function(context) { rendered++; }, update: function(jquery) { updated++; } }) }); view.createLayer(); equals(rendered, 1, 'rendered the child once'); equals(parentRendered, 1); equals(view.$('div').length, 1); view.destroyLayer(); view.createLayer(); equals(rendered, 2, 'rendered the child twice'); equals(parentRendered, 2); equals(view.$('div').length, 1); // Clean up. view.destroy();
}); // .….….….….….….….….….….….….…… // renderChildViews() //
module(“SC.View#renderChildViews”);
test(“creates a context and then invokes renderToContext or updateLayer on each childView”, function() {
var runCount = 0, curContext, curFirstTime ; var ChildView = SC.View.extend({ renderToContext: function(context) { equals(context.prevObject, curContext, 'passed child context of curContext'); equals(context.tagName(), this.get('tagName'), 'context setup with current tag name'); runCount++; // record run }, updateLayer: function() { runCount++; } }); var view = SC.View.create({ childViews: [ ChildView.extend({ tagName: 'foo' }), ChildView.extend({ tagName: 'bar' }), ChildView.extend({ tagName: 'baz' }) ] }); // VERIFY: firstTime= YES curContext = view.renderContext('div'); curFirstTime= YES ; equals(view.renderChildViews(curContext, curFirstTime), curContext, 'returns context'); equals(runCount, 3, 'renderToContext() invoked for each child view'); // VERIFY: firstTime= NO runCount = 0 ; //reset curContext = view.renderContext('div'); curFirstTime= NO ; equals(view.renderChildViews(curContext, curFirstTime), curContext, 'returns context'); equals(runCount, 3, 'updateLayer() invoked for each child view'); // Clean up. view.destroy();
});
test(“creates a context and then invokes renderChildViews to call renderToContext on each childView”, function() {
var runCount = 0, curContext ; var ChildView = SC.View.extend({ renderToContext: function(context) { equals(context.prevObject, curContext, 'passed child context of curContext'); equals(context.tagName(), this.get('tagName'), 'context setup with current tag name'); runCount++; // record run } }); var view = SC.View.create({ childViews: [ ChildView.extend({ tagName: 'foo' }), ChildView.extend({ tagName: 'bar' }), ChildView.extend({ tagName: 'baz' }) ] }); // VERIFY: firstTime= YES curContext = view.renderContext('div'); view.renderChildViews(curContext); equals(runCount, 3, 'renderToContext() invoked for each child view'); // Clean up. view.destroy();
});