tests are no longer failing :)

This commit is contained in:
DadaMonad 2015-02-23 13:20:39 +00:00
parent 2e9f8f6d03
commit f189ae11b0
21 changed files with 510 additions and 852 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -245,7 +245,11 @@ module.exports = function() {
Insert.prototype.type = "Insert"; Insert.prototype.type = "Insert";
Insert.prototype.val = function() { Insert.prototype.val = function() {
return this.content; if ((this.content != null) && (this.content.getCustomType != null)) {
return this.content.getCustomType();
} else {
return this.content;
}
}; };
Insert.prototype.applyDelete = function(o) { Insert.prototype.applyDelete = function(o) {

View File

@ -51,7 +51,7 @@ module.exports = function() {
rep = content; rep = content;
} }
this.retrieveSub(name).replace(rep); this.retrieveSub(name).replace(rep);
return this; return this.getCustomType();
} else if (name != null) { } else if (name != null) {
prop = this._map[name]; prop = this._map[name];
if ((prop != null) && !prop.isContentDeleted()) { if ((prop != null) && !prop.isContentDeleted()) {
@ -201,7 +201,7 @@ module.exports = function() {
result = []; result = [];
while (o !== this.end) { while (o !== this.end) {
if (!o.is_deleted) { if (!o.is_deleted) {
result.push(o); result.push(o.val());
} }
o = o.next_cl; o = o.next_cl;
} }
@ -285,6 +285,9 @@ module.exports = function() {
} else { } else {
for (_i = 0, _len = content.length; _i < _len; _i++) { for (_i = 0, _len = content.length; _i < _len; _i++) {
c = content[_i]; c = content[_i];
if ((c != null) && (c._name != null) && (c._getModel != null)) {
c = c._getModel(this.custom_types, this.operations);
}
tmp = (new ops.Insert(null, c, void 0, left, right)).execute(); tmp = (new ops.Insert(null, c, void 0, left, right)).execute();
left = tmp; left = tmp;
} }
@ -345,7 +348,7 @@ module.exports = function() {
this.event_properties = _at_event_properties; this.event_properties = _at_event_properties;
this.event_this = _at_event_this; this.event_this = _at_event_this;
if (this.event_properties['object'] == null) { if (this.event_properties['object'] == null) {
this.event_properties['object'] = this.event_this; this.event_properties['object'] = this.event_this.getCustomType();
} }
ReplaceManager.__super__.constructor.call(this, custom_type, uid, beginning, end); ReplaceManager.__super__.constructor.call(this, custom_type, uid, beginning, end);
} }
@ -465,7 +468,7 @@ module.exports = function() {
var old_value; var old_value;
if (this.next_cl.type === "Delimiter" && this.prev_cl.type !== "Delimiter") { if (this.next_cl.type === "Delimiter" && this.prev_cl.type !== "Delimiter") {
if (!this.is_deleted) { if (!this.is_deleted) {
old_value = this.prev_cl.content; old_value = this.prev_cl.val();
this.parent.callEventDecorator([ this.parent.callEventDecorator([
{ {
type: "update", type: "update",
@ -494,7 +497,7 @@ module.exports = function() {
{ {
type: "delete", type: "delete",
changedBy: o.uid.creator, changedBy: o.uid.creator,
oldValue: this.content oldValue: this.val()
} }
]); ]);
} }

71
build/node/Types/List.js Normal file
View File

@ -0,0 +1,71 @@
var YList;
YList = (function() {
function YList(list) {
if (list == null) {
this._list = [];
} else if (list.constructor === Array) {
this._list = list;
} else {
throw new Error("Y.List expects an Array as a parameter");
}
}
YList.prototype._name = "List";
YList.prototype._getModel = function(types, ops) {
if (this._model == null) {
this._model = new ops.ListManager(this).execute();
this.insert(0, this._list);
}
delete this._list;
return this._model;
};
YList.prototype._setModel = function(_at__model) {
this._model = _at__model;
return delete this._list;
};
YList.prototype.val = function() {
return this._model.val.apply(this._model, arguments);
};
YList.prototype.observe = function() {
this._model.observe.apply(this._model, arguments);
return this;
};
YList.prototype.unobserve = function() {
this._model.unobserve.apply(this._model, arguments);
return this;
};
YList.prototype.insert = function(position, content) {
if (typeof position !== "number") {
throw new Error("Y.List.insert expects a Number as the first parameter!");
}
this._model.insert(position, content);
return this;
};
YList.prototype["delete"] = function(position, length) {
this._model["delete"](position, length);
return this;
};
return YList;
})();
if (typeof window !== "undefined" && window !== null) {
if (window.Y != null) {
window.Y.List = YList;
} else {
throw new Error("You must first import Y!");
}
}
if (typeof module !== "undefined" && module !== null) {
module.exports = YList;
}

View File

@ -39,7 +39,13 @@ YObject = (function() {
}; };
YObject.prototype.observe = function(f) { YObject.prototype.observe = function(f) {
return this._model.observe(f); this._model.observe(f);
return this;
};
YObject.prototype.unobserve = function(f) {
this._model.unobserve(f);
return this;
}; };
YObject.prototype.val = function(name, content) { YObject.prototype.val = function(name, content) {
@ -64,7 +70,8 @@ YObject = (function() {
}; };
YObject.prototype["delete"] = function(name) { YObject.prototype["delete"] = function(name) {
return this._model["delete"](name); this._model["delete"](name);
return this;
}; };
return YObject; return YObject;

View File

@ -52,7 +52,7 @@ YText = (function() {
throw new Error("Y.String.insert expects a String as the second parameter!"); throw new Error("Y.String.insert expects a String as the second parameter!");
} }
if (typeof position !== "number") { if (typeof position !== "number") {
throw new Error("Y.String.insert expects a Number as the second parameter!"); throw new Error("Y.String.insert expects a Number as the first parameter!");
} }
if (content.length > 0) { if (content.length > 0) {
ith = this._model.getOperationByPosition(position); ith = this._model.getOperationByPosition(position);

View File

@ -43,5 +43,3 @@ if (typeof window !== "undefined" && window !== null) {
} }
createY.Object = require("./Types/Object"); createY.Object = require("./Types/Object");
createY.Text = require("./Types/Text");

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -301,7 +301,10 @@ module.exports = ()->
type: "Insert" type: "Insert"
val: ()-> val: ()->
@content if @content? and @content.getCustomType?
@content.getCustomType()
else
@content
# #
# set content to null and other stuff # set content to null and other stuff

View File

@ -42,7 +42,7 @@ module.exports = ()->
else else
rep = content rep = content
@retrieveSub(name).replace rep @retrieveSub(name).replace rep
@ @getCustomType()
else if name? else if name?
prop = @_map[name] prop = @_map[name]
if prop? and not prop.isContentDeleted() if prop? and not prop.isContentDeleted()
@ -172,7 +172,7 @@ module.exports = ()->
result = [] result = []
while o isnt @end while o isnt @end
if not o.is_deleted if not o.is_deleted
result.push o result.push o.val()
o = o.next_cl o = o.next_cl
result result
@ -243,6 +243,8 @@ module.exports = ()->
(new ops.Insert null, content, undefined, left, right).execute() (new ops.Insert null, content, undefined, left, right).execute()
else else
for c in content for c in content
if c? and c._name? and c._getModel?
c = c._getModel(@custom_types, @operations)
tmp = (new ops.Insert null, c, undefined, left, right).execute() tmp = (new ops.Insert null, c, undefined, left, right).execute()
left = tmp left = tmp
@ @
@ -317,7 +319,7 @@ module.exports = ()->
# @param {Delimiter} end Reference or Object. # @param {Delimiter} end Reference or Object.
constructor: (custom_type, @event_properties, @event_this, uid, beginning, end)-> constructor: (custom_type, @event_properties, @event_this, uid, beginning, end)->
if not @event_properties['object']? if not @event_properties['object']?
@event_properties['object'] = @event_this @event_properties['object'] = @event_this.getCustomType()
super custom_type, uid, beginning, end super custom_type, uid, beginning, end
type: "ReplaceManager" type: "ReplaceManager"
@ -439,7 +441,7 @@ module.exports = ()->
if @next_cl.type is "Delimiter" and @prev_cl.type isnt "Delimiter" if @next_cl.type is "Delimiter" and @prev_cl.type isnt "Delimiter"
# this replaces another Replaceable # this replaces another Replaceable
if not @is_deleted # When this is received from the HB, this could already be deleted! if not @is_deleted # When this is received from the HB, this could already be deleted!
old_value = @prev_cl.content old_value = @prev_cl.val()
@parent.callEventDecorator [ @parent.callEventDecorator [
type: "update" type: "update"
changedBy: @uid.creator changedBy: @uid.creator
@ -462,7 +464,7 @@ module.exports = ()->
@parent.callEventDecorator [ @parent.callEventDecorator [
type: "delete" type: "delete"
changedBy: o.uid.creator changedBy: o.uid.creator
oldValue: @content oldValue: @val()
] ]
# #

View File

@ -0,0 +1,70 @@
class YList
#
# @private
# @param {Object} uid A unique identifier. If uid is undefined, a new uid will be created.
#
constructor: (list)->
if not list?
@_list = []
else if list.constructor is Array
@_list = list
else
throw new Error "Y.List expects an Array as a parameter"
_name: "List"
_getModel: (types, ops)->
if not @_model?
@_model = new ops.ListManager(@).execute()
@insert 0, @_list
delete @_list
@_model
_setModel: (@_model)->
delete @_list
val: ()->
@_model.val.apply @_model, arguments
observe: ()->
@_model.observe.apply @_model, arguments
@
unobserve: ()->
@_model.unobserve.apply @_model, arguments
@
#
# Inserts a Array into the list.
#
# @return {ListManager Type} This String object.
#
insert: (position, content)->
if typeof position isnt "number"
throw new Error "Y.List.insert expects a Number as the first parameter!"
@_model.insert position, content
@
delete: (position, length)->
@_model.delete position, length
@
if window?
if window.Y?
window.Y.List = YList
else
throw new Error "You must first import Y!"
if module?
module.exports = YList

View File

@ -24,6 +24,11 @@ class YObject
observe: (f)-> observe: (f)->
@_model.observe f @_model.observe f
@
unobserve: (f)->
@_model.unobserve f
@
# #
# @overload val() # @overload val()
@ -57,6 +62,7 @@ class YObject
delete: (name)-> delete: (name)->
@_model.delete(name) @_model.delete(name)
@
if window? if window?
if window.Y? if window.Y?

View File

@ -1,6 +1,5 @@
# #
# Handles a String-like data structures with support for insert/delete at a word-position. # Handles a String-like data structures with support for insert/delete at a word-position.
# @note Currently, only Text is supported!
# #
class YText class YText
@ -59,7 +58,7 @@ class YText
if content.constructor isnt String if content.constructor isnt String
throw new Error "Y.String.insert expects a String as the second parameter!" throw new Error "Y.String.insert expects a String as the second parameter!"
if typeof position isnt "number" if typeof position isnt "number"
throw new Error "Y.String.insert expects a Number as the second parameter!" throw new Error "Y.String.insert expects a Number as the first parameter!"
if content.length > 0 if content.length > 0
ith = @_model.getOperationByPosition position ith = @_model.getOperationByPosition position
# the (i-1)th character. e.g. "abc" the 1th character is "a" # the (i-1)th character. e.g. "abc" the 1th character is "a"

View File

@ -37,4 +37,3 @@ if window?
window.Y = createY window.Y = createY
createY.Object = require "./Types/Object" createY.Object = require "./Types/Object"
createY.Text = require "./Types/Text"

View File

@ -9,6 +9,8 @@ chai.use(sinonChai)
Connector = require "../../y-test/lib/y-test.coffee" Connector = require "../../y-test/lib/y-test.coffee"
Y = require "../lib/y.coffee" Y = require "../lib/y.coffee"
Y.Text = require "../lib/Types/Text"
Y.List = require "../lib/Types/List"
compare = (o1, o2)-> compare = (o1, o2)->
if o1._name? and o1._name isnt o2._name if o1._name? and o1._name isnt o2._name
@ -24,6 +26,10 @@ compare = (o1, o2)->
Test = require "./TestSuite" Test = require "./TestSuite"
class JsonTest extends Test class JsonTest extends Test
constructor: (suffix)->
super suffix, Y
makeNewUser: (userId)-> makeNewUser: (userId)->
conn = new Connector userId conn = new Connector userId
super new Y conn super new Y conn
@ -148,19 +154,19 @@ describe "JsonFramework", ->
expect(@yTest.getSomeUser().val("a").val("a").val("q").val()).to.equal("Adtrndtrtdrntdrnrtdnrtdnrtdnrtdnrdnrdt") expect(@yTest.getSomeUser().val("a").val("a").val("q").val()).to.equal("Adtrndtrtdrntdrnrtdnrtdnrtdnrtdnrdnrdt")
it "can handle creaton of complex json (3)", -> it "can handle creaton of complex json (3)", ->
@yTest.users[0].val('l', [1,2,3], "mutable") @yTest.users[0].val('l', new Y.List([1,2,3]))
@yTest.users[1].val('l', [4,5,6], "mutable") @yTest.users[1].val('l', new Y.List([4,5,6]))
@yTest.compareAll() @yTest.compareAll()
@yTest.users[2].val('l').insert(0,'A') @yTest.users[2].val('l').insert(0,'A')
w = @yTest.users[1].val('l').insert(0,'B', "mutable").val(0) w = @yTest.users[1].val('l').insert(0,new Y.Text('B')).val(0)
w.insert 1, "C" w.insert 1, "C"
expect(w.val()).to.equal("BC") expect(w.val()).to.equal("BC")
@yTest.compareAll() @yTest.compareAll()
it "handles immutables and primitive data types", -> it "handles immutables and primitive data types", ->
@yTest.getSomeUser().val('string', new Y.Text("text")) @yTest.getSomeUser().val('string', "text")
@yTest.getSomeUser().val('number', 4) @yTest.getSomeUser().val('number', 4)
@yTest.getSomeUser().val('object', {q:"rr"}) @yTest.getSomeUser().val('object', new Y.Object({q:"rr"}))
@yTest.getSomeUser().val('null', null) @yTest.getSomeUser().val('null', null)
@yTest.compareAll() @yTest.compareAll()
expect(@yTest.getSomeUser().val('string')).to.equal "text" expect(@yTest.getSomeUser().val('string')).to.equal "text"

View File

@ -7,13 +7,14 @@ _ = require("underscore")
chai.use(sinonChai) chai.use(sinonChai)
Connector = require "../../y-test/lib/y-test.coffee" Connector = require "../../y-test/lib/y-test.coffee"
Y = require "../lib/y" Y = null
module.exports = class Test module.exports = class Test
constructor: (@name_suffix = "")-> constructor: (@name_suffix = "", Yjs)->
Y = Yjs
@number_of_test_cases_multiplier = 1 @number_of_test_cases_multiplier = 1
@repeat_this = 1 * @number_of_test_cases_multiplier @repeat_this = 1 * @number_of_test_cases_multiplier
@doSomething_amount = 1230 * @number_of_test_cases_multiplier @doSomething_amount = 123 * @number_of_test_cases_multiplier
@number_of_engines = 5 + @number_of_test_cases_multiplier - 1 @number_of_engines = 5 + @number_of_test_cases_multiplier - 1
@time = 0 # denotes to the time when run was started @time = 0 # denotes to the time when run was started
@ -94,13 +95,20 @@ module.exports = class Test
throw new Error "implement me!" throw new Error "implement me!"
compare: (o1, o2)-> compare: (o1, o2)->
if o1._name? and o1._name isnt o2._name if o1 is o2
true
else if o1._name? and o1._name isnt o2._name
throw new Error "different types" throw new Error "different types"
else if o1._name is "Object" else if o1._name is "Object"
for name, val of o1.val() for name, val of o1.val()
@compare(val, o2.val(name)) @compare(val, o2.val(name))
else if o1._name? else if o1._name?
@compare(o1.val(), o2.val()) @compare(o1.val(), o2.val())
else if o1.constructor is Array and o2.constructor is Array
if o1.length isnt o2.length
throw new Error "The Arrays do not have the same size!"
for o,i in o1
@compare o, o2[i]
else if o1 isnt o2 else if o1 isnt o2
throw new Error "different values" throw new Error "different values"

View File

@ -8,11 +8,16 @@ _ = require("underscore")
chai.use(sinonChai) chai.use(sinonChai)
Y = require "../lib/y" Y = require "../lib/y"
Y.Text = require "../lib/Types/Text"
Connector = require "../../y-test/lib/y-test.coffee" Connector = require "../../y-test/lib/y-test.coffee"
Test = require "./TestSuite" Test = require "./TestSuite"
class TextTest extends Test class TextTest extends Test
constructor: (suffix)->
super suffix, Y
type: "TextTest" type: "TextTest"
makeNewUser: (userId)-> makeNewUser: (userId)->

File diff suppressed because one or more lines are too long

3
y.js

File diff suppressed because one or more lines are too long