From 964e17d7ab0248ee621f210912ac68dce2c185fa Mon Sep 17 00:00:00 2001 From: SamuraiJack Date: Sun, 10 Jan 2010 19:07:49 +0300 Subject: [PATCH] - tested correctness of mutability of builder class --- META.json | 6 +- lib/Joose.js | 10 ++-- lib/Joose/Managed/Class.js | 25 +++----- lib/Joose/Proto/Object.js | 4 +- lib/Task/Joose/Core.js | 39 +++++------- t/020_managed_class.t.js | 8 +-- t/023_builder_stem_inheritance.t.js | 93 +++++++++++++++++++++++++++++ t/024_builder_stem_inheritance.t.js | 65 ++++++++++++++++++++ t/index.html | 2 + 9 files changed, 195 insertions(+), 57 deletions(-) create mode 100644 t/023_builder_stem_inheritance.t.js create mode 100644 t/024_builder_stem_inheritance.t.js diff --git a/META.json b/META.json index 5eb67d3b..f7c7f076 100644 --- a/META.json +++ b/META.json @@ -7,7 +7,7 @@ "url" : "http://module-build.sourceforge.net/META-spec-v1.4.html" }, "generated_by" : "Module::Build version 0.35", - "version" : "3.002", + "version" : "3.003", "name" : "Joose", "author" : [ "Nickolay Platonov (aka SamuraiJack) " @@ -31,7 +31,7 @@ "file" : "lib/Joose/Manual/Traits.js" }, "Joose" : { - "version" : "3.002", + "version" : "3.003", "file" : "lib/Joose.js" }, "Joose.Meta.Object" : { @@ -191,7 +191,7 @@ "file" : "lib/Joose/Manual/FAQ.js" }, "Task.Joose.Core" : { - "version" : "3.002", + "version" : "3.003", "file" : "lib/Task/Joose/Core.js" }, "Joose.Manual.Installation" : { diff --git a/lib/Joose.js b/lib/Joose.js index a58c2cd9..766a0298 100644 --- a/lib/Joose.js +++ b/lib/Joose.js @@ -129,10 +129,12 @@ Joose.O = { //initializers -Joose.I.Array = function () { return [] } -Joose.I.Object = function () { return {} } -Joose.I.Function = function () { return function () {} } -Joose.I.Now = function () { return new Date() } +Joose.I = { + Array : function () { return [] }, + Object : function () { return {} }, + Function : function () { return function () {} }, + Now : function () { return new Date() } +} diff --git a/lib/Joose/Managed/Class.js b/lib/Joose/Managed/Class.js index fe97ec3d..aebab24e 100644 --- a/lib/Joose/Managed/Class.js +++ b/lib/Joose/Managed/Class.js @@ -14,6 +14,7 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', { firstPass : true, + //build for metaclasses - collects traits from roles BUILD : function () { var props = Joose.Managed.Class.superClass.BUILD.apply(this, arguments) @@ -70,6 +71,12 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', { this.builder = new this.builderClass({ targetMeta : this }) this.stem = new this.stemClass({ name : this.name, targetMeta : this }) + + var builderClass = this.getAttributedClass('builderClass') + if (builderClass) this.addAttribute('builderClass', this.subClassOf(builderClass)) + + var stemClass = this.getAttributedClass('stemClass') + if (stemClass) this.addAttribute('stemClass', this.subClassOf(stemClass)) }, @@ -94,34 +101,16 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', { getBuilderTarget : function () { var builderClass = this.getAttributedClass('builderClass') - - if (this.builderClassMutated) return builderClass - if (!builderClass) throw "Attempt to extend a builder on non-meta class" - this.builderClassMutated = true - - builderClass = this.subClassOf(builderClass) - - this.addAttribute('builderClass', builderClass) - return builderClass }, getStemTarget : function () { var stemClass = this.getAttributedClass('stemClass') - - if (this.stemClassMutated) return stemClass - if (!stemClass) throw "Attempt to extend a stem on non-meta class" - this.stemClassMutated = true - - stemClass = this.subClassOf(stemClass) - - this.addAttribute('stemClass', stemClass) - return stemClass }, diff --git a/lib/Joose/Proto/Object.js b/lib/Joose/Proto/Object.js index 596906a1..57f379f1 100644 --- a/lib/Joose/Proto/Object.js +++ b/lib/Joose/Proto/Object.js @@ -32,9 +32,7 @@ }, - BUILD : function () { - var config = arguments[0] - + BUILD : function (config) { return arguments.length == 1 && typeof config == 'object' && config || {} }, diff --git a/lib/Task/Joose/Core.js b/lib/Task/Joose/Core.js index dcfabd3a..6800fdd1 100644 --- a/lib/Task/Joose/Core.js +++ b/lib/Task/Joose/Core.js @@ -129,10 +129,12 @@ Joose.O = { //initializers -Joose.I.Array = function () { return [] } -Joose.I.Object = function () { return {} } -Joose.I.Function = function () { return function () {} } -Joose.I.Now = function () { return new Date() } +Joose.I = { + Array : function () { return [] }, + Object : function () { return {} }, + Function : function () { return function () {} }, + Now : function () { return new Date() } +} @@ -595,9 +597,7 @@ Joose.Proto.Empty.meta = { }, - BUILD : function () { - var config = arguments[0] - + BUILD : function (config) { return arguments.length == 1 && typeof config == 'object' && config || {} }, @@ -2062,6 +2062,7 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', { firstPass : true, + //build for metaclasses - collects traits from roles BUILD : function () { var props = Joose.Managed.Class.superClass.BUILD.apply(this, arguments) @@ -2118,6 +2119,12 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', { this.builder = new this.builderClass({ targetMeta : this }) this.stem = new this.stemClass({ name : this.name, targetMeta : this }) + + var builderClass = this.getAttributedClass('builderClass') + if (builderClass) this.addAttribute('builderClass', this.subClassOf(builderClass)) + + var stemClass = this.getAttributedClass('stemClass') + if (stemClass) this.addAttribute('stemClass', this.subClassOf(stemClass)) }, @@ -2142,34 +2149,16 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', { getBuilderTarget : function () { var builderClass = this.getAttributedClass('builderClass') - - if (this.builderClassMutated) return builderClass - if (!builderClass) throw "Attempt to extend a builder on non-meta class" - this.builderClassMutated = true - - builderClass = this.subClassOf(builderClass) - - this.addAttribute('builderClass', builderClass) - return builderClass }, getStemTarget : function () { var stemClass = this.getAttributedClass('stemClass') - - if (this.stemClassMutated) return stemClass - if (!stemClass) throw "Attempt to extend a stem on non-meta class" - this.stemClassMutated = true - - stemClass = this.subClassOf(stemClass) - - this.addAttribute('stemClass', stemClass) - return stemClass }, diff --git a/t/020_managed_class.t.js b/t/020_managed_class.t.js index 945baf8b..e06e6134 100644 --- a/t/020_managed_class.t.js +++ b/t/020_managed_class.t.js @@ -48,12 +48,12 @@ StartTest(function (t) { //================================================================================================================================================================================== t.diag("Extending of builder") - var TestMetaClass = new Joose.Managed.Class('TestClass1', { + var TestMetaClass = new Joose.Managed.Class('TestMetaClass', { isa : Joose.Managed.Class, builder : { methods : { - testHandler : function (meta, props) { + testBuilder : function (meta, props) { var name = props.name var value = props.value @@ -70,7 +70,7 @@ StartTest(function (t) { var TestClass1 = new TestMetaClass('TestClass1', { isa : TestClass, - testHandler : { + testBuilder : { name : 'result', value : 'TestClass1' } @@ -83,7 +83,7 @@ StartTest(function (t) { var TestClass11 = new TestMetaClass('TestClass11', { - testHandler : { + testBuilder : { name : 'result', value : 'TestClass11' } diff --git a/t/023_builder_stem_inheritance.t.js b/t/023_builder_stem_inheritance.t.js new file mode 100644 index 00000000..e957624c --- /dev/null +++ b/t/023_builder_stem_inheritance.t.js @@ -0,0 +1,93 @@ +StartTest(function (t) { + + t.plan(7) + + //================================================================================================================================================================================== + t.diag("Sanity") + + t.ok(Joose.Managed.Class, "Joose.Managed.Class is here") + + + //================================================================================================================================================================================== + t.diag("Inheritance of builder class") + + var BaseMetaClass = new Joose.Managed.Class('BaseMetaClass', { + isa : Joose.Managed.Class, + + builder : { + methods : { + testBuilder : function (meta, props) { + var name = props.name + var value = props.value + + meta.addMethod(name, function () { + return value + }) + } + } + } + + }).c + + + var TestClass1 = new BaseMetaClass('TestClass1', { + + testBuilder : { + name : 'result', + value : 'TestClass1' + } + + }).c + + var testClass1 = new TestClass1() + + t.ok(TestClass1.meta.hasOwnMethod('result') && testClass1.result() == 'TestClass1', "Builder was extened and works correctly #1") + + t.ok(BaseMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder'), "BaseMetaClass extended its builder class") + + + + var SuperMetaClass = new Joose.Managed.Class('SuperMetaClass', { + + isa : BaseMetaClass, + + builder : { + methods : { + testBuilder2 : function (meta, props) { + var name = props.name + var value = props.value + + meta.addMethod(name, function () { + return name + }) + } + } + } + }).c + + + t.ok(SuperMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder'), "'SuperMetaClass' inherited 'testBuilder'") + t.ok(SuperMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder2'), "'SuperMetaClass' received 'testBuilder2'") + + + + var TestClass2 = new SuperMetaClass('TestClass2', { + + testBuilder : { + name : 'result', + value : 'TestClass2' + }, + + testBuilder2 : { + name : 'result2', + value : 'TestClass2' + } + + }).c + + var testClass2 = new TestClass2() + + t.ok(TestClass2.meta.hasOwnMethod('result') && testClass2.result() == 'TestClass2', "Builder was inherited #1") + t.ok(TestClass2.meta.hasOwnMethod('result2') && testClass2.result2() == 'result2', "Builder was extened and works correctly #2") + +}) \ No newline at end of file diff --git a/t/024_builder_stem_inheritance.t.js b/t/024_builder_stem_inheritance.t.js new file mode 100644 index 00000000..ff458691 --- /dev/null +++ b/t/024_builder_stem_inheritance.t.js @@ -0,0 +1,65 @@ +StartTest(function (t) { + + t.plan(5) + + //================================================================================================================================================================================== + t.diag("Sanity") + + t.ok(Joose.Managed.Class, "Joose.Managed.Class is here") + + + //================================================================================================================================================================================== + t.diag("Defining a metaclass with unmodified builder class") + + var BaseMetaClass = new Joose.Managed.Class('BaseMetaClass', { + isa : Joose.Managed.Class + }).c + + + + var SuperMetaClass = new Joose.Managed.Class('SuperMetaClass', { + + isa : BaseMetaClass, + + builder : { + methods : { + testBuilder2 : function (meta, props) { + var name = props.name + var value = props.value + + meta.addMethod(name, function () { + return name + }) + } + } + } + }).c + + + t.ok(SuperMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder2'), "'SuperMetaClass' received 'testBuilder2'") + t.ok(!BaseMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder2'), "BaseMetaClass don't received 'testBuilder2'") + + //================================================================================================================================================================================== + t.diag("Mutation of builder class") + + + BaseMetaClass.meta.extend({ + builder : { + methods : { + testBuilder : function (meta, props) { + var name = props.name + var value = props.value + + meta.addMethod(name, function () { + return value + }) + } + } + } + }) + + t.ok(BaseMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder'), "BaseMetaClass extended its builder class") + + t.ok(SuperMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder2'), "and it reflected in sub-meta-classes") + +}) \ No newline at end of file diff --git a/t/index.html b/t/index.html index a4ac3660..a8ece503 100644 --- a/t/index.html +++ b/t/index.html @@ -47,6 +47,8 @@ '020_managed_class.t.js', '021_method_modifiers.t.js', '022_inheriting_from_proto_class.t.js', + '023_builder_stem_inheritance.t.js', + '024_builder_stem_inheritance.t.js', '031_managed_role.t.js', '032_role_application_basic.t.js', '033_role_application_sugar.t.js',