more exhaustive test suite
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
#
|
||||
createPeerJsConnector = (peer_js_parameters, callback)->
|
||||
|
||||
peer = new Peer peer_js_parameters
|
||||
peer = new Peer peer_js_parameters
|
||||
|
||||
#
|
||||
# @see http://peerjs.com
|
||||
|
||||
@@ -22,7 +22,7 @@ class Engine
|
||||
throw new Error "You forgot to specify a parser for type #{json.type}. The message is #{JSON.stringify json}."
|
||||
|
||||
#
|
||||
# Apply a set of operations. E.g. the operations you received from another users HB.toJson().
|
||||
# Apply a set of operations. E.g. the operations you received from another users HB._encode().
|
||||
# @note You must not use this method when you already have ops in your HB!
|
||||
#
|
||||
applyOpsBundle: (ops_json)->
|
||||
|
||||
@@ -18,11 +18,12 @@ class JsonYatta
|
||||
#
|
||||
constructor: (user_id, Connector)->
|
||||
@HB = new HistoryBuffer user_id
|
||||
json_types = json_types_uninitialized @HB
|
||||
@engine = new Engine @HB, json_types.parser
|
||||
@connector = new Connector @engine, @HB, json_types.execution_listener, @
|
||||
type_manager = json_types_uninitialized @HB
|
||||
@types = type_manager.types
|
||||
@engine = new Engine @HB, type_manager.parser
|
||||
@connector = new Connector @engine, @HB, type_manager.execution_listener, @
|
||||
|
||||
first_word = new json_types.types.JsonType @HB.getReservedUniqueIdentifier()
|
||||
first_word = new @types.JsonType @HB.getReservedUniqueIdentifier()
|
||||
@HB.addOperation(first_word).execute()
|
||||
@root_element = first_word
|
||||
|
||||
@@ -64,6 +65,12 @@ class JsonYatta
|
||||
getUserId: ()->
|
||||
@HB.getUserId()
|
||||
|
||||
#
|
||||
# @see JsonType.toJson
|
||||
#
|
||||
toJson : ()->
|
||||
@root_element.toJson()
|
||||
|
||||
#
|
||||
# @see JsonType.val
|
||||
#
|
||||
|
||||
@@ -15,24 +15,32 @@ class TextYatta
|
||||
constructor: (user_id, Connector)->
|
||||
@HB = new HistoryBuffer user_id
|
||||
text_types = text_types_uninitialized @HB
|
||||
types = text_types.types
|
||||
@types = text_types.types
|
||||
@engine = new Engine @HB, text_types.parser
|
||||
@connector = new Connector @engine, @HB, text_types.execution_listener, @
|
||||
|
||||
beginning = @HB.addOperation new types.Delimiter {creator: '_', op_number: '_beginning'} , undefined, undefined
|
||||
end = @HB.addOperation new types.Delimiter {creator: '_', op_number: '_end'} , beginning, undefined
|
||||
beginning = @HB.addOperation new @types.Delimiter {creator: '_', op_number: '_beginning'} , undefined, undefined
|
||||
end = @HB.addOperation new @types.Delimiter {creator: '_', op_number: '_end'} , beginning, undefined
|
||||
beginning.next_cl = end
|
||||
beginning.execute()
|
||||
end.execute()
|
||||
first_word = new text_types.types.Word {creator: '_', op_number: '_'}, beginning, end
|
||||
first_word = new @types.Word {creator: '_', op_number: '_'}, beginning, end
|
||||
@HB.addOperation(first_word).execute()
|
||||
@root_element = first_word
|
||||
|
||||
uid_r = { creator: '_', op_number: "RM" }
|
||||
uid_beg = { creator: '_', op_number: "_RM_beginning" }
|
||||
uid_end = { creator: '_', op_number: "_RM_end" }
|
||||
beg = @HB.addOperation(new @types.Delimiter uid_beg, undefined, uid_end).execute()
|
||||
end = @HB.addOperation(new @types.Delimiter uid_end, beg, undefined).execute()
|
||||
@root_element = @HB.addOperation(new @types.ReplaceManager undefined, uid_r, beg, end).execute()
|
||||
@root_element.replace first_word, { creator: '_', op_number: 'Replaceable'}
|
||||
|
||||
|
||||
#
|
||||
# @result Word
|
||||
#
|
||||
getRootElement: ()->
|
||||
@root_element
|
||||
@root_element.val()
|
||||
|
||||
#
|
||||
# @see Engine
|
||||
@@ -64,31 +72,31 @@ class TextYatta
|
||||
# @see JsonType.val
|
||||
#
|
||||
val: ()->
|
||||
@root_element.val()
|
||||
@getRootElement().val()
|
||||
|
||||
#
|
||||
# @see Word.insertText
|
||||
#
|
||||
insertText: (pos, content)->
|
||||
@root_element.insertText pos, content
|
||||
@getRootElement().insertText pos, content
|
||||
|
||||
#
|
||||
# @see Word.deleteText
|
||||
#
|
||||
deleteText: (pos, length)->
|
||||
@root_element.deleteText pos, length
|
||||
@getRootElement().deleteText pos, length
|
||||
|
||||
#
|
||||
# @see Word.bind
|
||||
#
|
||||
bind: (textarea)->
|
||||
@root_element.bind textarea
|
||||
@getRootElement().bind textarea
|
||||
|
||||
#
|
||||
# @see Word.replaceText
|
||||
#
|
||||
replaceText: (text)->
|
||||
@root_element.replaceText text
|
||||
@getRootElement().replaceText text
|
||||
|
||||
|
||||
module.exports = TextYatta
|
||||
|
||||
@@ -81,8 +81,8 @@ module.exports = (HB)->
|
||||
else
|
||||
x
|
||||
set : (o)->
|
||||
if o.constructor is {}.constructor
|
||||
overwrite = jsonType.val(name)
|
||||
overwrite = jsonType.val(name)
|
||||
if o.constructor is {}.constructor and overwrite instanceof types.Operation
|
||||
for o_name,o_obj of o
|
||||
overwrite.val(o_name, o_obj, 'immutable')
|
||||
else
|
||||
@@ -109,6 +109,24 @@ module.exports = (HB)->
|
||||
for name,o of initial_value
|
||||
@val name, o, mutable
|
||||
|
||||
#
|
||||
# Transform this to a Json and loose all the sharing-abilities (the new object will be a deep clone)!
|
||||
# @return {Json}
|
||||
#
|
||||
toJson: ()->
|
||||
val = @val()
|
||||
json = {}
|
||||
for name, o of val
|
||||
if o.constructor is {}.constructor
|
||||
json[name] = @val(name).toJson()
|
||||
else if o instanceof types.Operation
|
||||
while o instanceof types.Operation
|
||||
o = o.val()
|
||||
json[name] = o
|
||||
else
|
||||
json[name] = o
|
||||
json
|
||||
|
||||
#
|
||||
# Whether the default is 'mutable' (true) or 'immutable' (false)
|
||||
#
|
||||
|
||||
@@ -77,7 +77,6 @@ module.exports = (HB)->
|
||||
uid_end.op_number = "_#{uid_end.op_number}_RM_#{@name}_end"
|
||||
beg = HB.addOperation(new types.Delimiter uid_beg, undefined, uid_end).execute()
|
||||
end = HB.addOperation(new types.Delimiter uid_end, beg, undefined).execute()
|
||||
#beg.execute()
|
||||
@map_manager.map[@name] = HB.addOperation(new ReplaceManager undefined, uid_r, beg, end).execute()
|
||||
super
|
||||
|
||||
@@ -191,9 +190,12 @@ module.exports = (HB)->
|
||||
#
|
||||
# Replace the existing word with a new word.
|
||||
#
|
||||
replace: (content)->
|
||||
# @param content {Operation} The new value of this ReplaceManager.
|
||||
# @param replaceable_uid {UID} Optional: Unique id of the Replaceable that is created
|
||||
#
|
||||
replace: (content, replaceable_uid)->
|
||||
o = @getLastOperation()
|
||||
op = new Replaceable content, @, undefined, o, o.next_cl
|
||||
op = new Replaceable content, @, replaceable_uid, o, o.next_cl
|
||||
HB.addOperation(op).execute()
|
||||
|
||||
#
|
||||
@@ -202,9 +204,9 @@ module.exports = (HB)->
|
||||
#
|
||||
val: ()->
|
||||
o = @getLastOperation()
|
||||
if o instanceof types.Delimiter
|
||||
throw new Error "dtrn"
|
||||
o.val()
|
||||
#if o instanceof types.Delimiter
|
||||
# throw new Error "Replace Manager doesn't contain anything."
|
||||
o.val?() # ? - for the case that (currently) the RM does not contain anything (then o is a Delimiter)
|
||||
|
||||
#
|
||||
# Encode this operation in such a way that it can be parsed by remote peers.
|
||||
|
||||
Reference in New Issue
Block a user