Skip to content

Commit

Permalink
Added tests for bi-directional to-one relations
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffwatkins committed Nov 22, 2010
1 parent 7aa5a63 commit 600deb2
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 11 deletions.
6 changes: 6 additions & 0 deletions spec/model/model-spec.js
Expand Up @@ -60,6 +60,12 @@ describe("coherent.Model", function() {
object.setValueForKey(123, 'zebra');
}
expect(testInvalidType).toThrow("Invalid type for zebra");

function testInvalidTypeSetter()
{
object.setZebra(123);
}
expect(testInvalidTypeSetter).toThrow("Invalid type for zebra");
});

it("should convert date from strings", function() {
Expand Down
38 changes: 33 additions & 5 deletions spec/model/model-to-one-spec.js
@@ -1,25 +1,53 @@
describe("Model ToOne relations", function() {

it("should set inverse relation", function() {
var M1= Model("Model1", {
beforeEach(function(){
coherent.Model._resetModels();

this.M1= Model("Model1", {
m2: Model.ToOne({
type: "Model2",
inverse: "m1"
})
});

var M2= Model("Model2", {
this.M2= Model("Model2", {
m1: Model.ToOne({
type: "Model1",
inverse: "m2"
})
});

var m1= new M1();
var m2= new M2();

});

it("should set inverse relation via setValueForKey", function() {
var m1= new this.M1();
var m2= new this.M2();

m1.setValueForKey(m2, 'm2');
expect(m2.m1()).toBe(m1);
});

it("should set inverse relation via set method", function() {
var m1= new this.M1();
var m2= new this.M2();

m1.setM2(m2);
expect(m2.m1()).toBe(m1);
});

it("should clear previous inverse relation when setting new value", function() {
var m1= new this.M1();
var m2= new this.M2();
var m2a= new this.M2();

debugger;
m1.setM2(m2);
expect(m2.m1()).toBe(m1);

m1.setM2(m2a);
expect(m2.m1()).toBeNull();
expect(m2a.m1()).toBe(m1);
});

});
2 changes: 1 addition & 1 deletion src/model/Model.js
Expand Up @@ -178,7 +178,7 @@

coherent.Model.ToOne= function(decl)
{
decl= Object.extend(coherent.Model.ToOne.DEFAULTS, decl);
decl= Object.applyDefaults(decl, coherent.Model.ToOne.DEFAULTS);
return new coherent.Model.Property(decl);
}

Expand Down
10 changes: 5 additions & 5 deletions src/model/ModelObject.js
Expand Up @@ -85,7 +85,7 @@
var methodInfo= this.constructor.__classInfo.methods[key];
var previous;

if (methodInfo && methodInfo.type &&
if (void(0)!=value && methodInfo && methodInfo.type &&
((methodInfo.primitive && value.constructor!==methodInfo.type) ||
(!methodInfo.primitive && !(value instanceof methodInfo.type))))
{
Expand Down Expand Up @@ -118,19 +118,19 @@

if (inverse.relation===coherent.Model.ToOne)
{
if (this===previousInverse)
if (previous && this===previousInverse)
previous.setValueForKey(null, methodInfo.inverse);
if (this!==valueInverse)
if (value && this!==valueInverse)
value.setValueForKey(this, methodInfo.inverse);
}
else if (inverse.relation===coherent.Model.ToMany)
{
var previousIndexOfThis= previousInverse ? previousInverse.indexOfObject(this) : -1;
var valueIndexOfThis= value ? value.indexOfObject(this) : -1;

if (-1!==previousIndexOfThis)
if (previousInverse && -1!==previousIndexOfThis)
previousInverse.removeObjectAtIndex(previousIndexOfThis);
if (-1===valueIndexOfThis)
if (value && -1===valueIndexOfThis)
value.addObject(this);
}
},
Expand Down

0 comments on commit 600deb2

Please sign in to comment.