added tests for observer types

This commit is contained in:
DadaMonad
2014-12-24 11:35:06 +00:00
parent 2f47ad9e3a
commit fd1128d456
33 changed files with 607 additions and 240 deletions

View File

@@ -277,12 +277,7 @@ module.exports = (HB)->
garbagecollect = true
super garbagecollect
if callLater
@parent.callEvent [
type: "insert"
position: @getPosition()
object: @parent # TODO: You can combine getPosition + getParent in a more efficient manner! (only left Delimiter will hold @parent)
changed_by: o.uid.creator
]
@callOperationSpecificDeleteEvents(o)
if @next_cl?.isDeleted()
# garbage collect next_cl
@next_cl.applyDelete()
@@ -378,18 +373,27 @@ module.exports = (HB)->
@setParent @prev_cl.getParent() # do Insertions always have a parent?
super # notify the execution_listeners
@callOperationSpecificEvents()
@callOperationSpecificInsertEvents()
@
callOperationSpecificEvents: ()->
callOperationSpecificInsertEvents: ()->
@parent?.callEvent [
type: "insert"
position: @getPosition()
object: @parent
changed_by: @uid.creator
changedBy: @uid.creator
value: @content
]
callOperationSpecificDeleteEvents: (o)->
@parent.callEvent [
type: "delete"
position: @getPosition()
object: @parent # TODO: You can combine getPosition + getParent in a more efficient manner! (only left Delimiter will hold @parent)
length: 1
changedBy: o.uid.creator
]
#
# Compute the position of this operation.
#

View File

@@ -145,7 +145,7 @@ module.exports = (HB)->
that = @
Object.observe @bound_json, (events)->
for event in events
if not event.changed_by? and (event.type is "add" or event.type = "update")
if not event.changedBy? and (event.type is "add" or event.type = "update")
# this event is not created by Yatta.
that.val(event.name, event.object[event.name])
@observe (events)->
@@ -162,7 +162,7 @@ module.exports = (HB)->
type: 'update'
name: event.name
oldValue: oldVal
changed_by: event.changed_by
changedBy: event.changedBy
else
notifier.performChange 'add', ()->
that.bound_json[event.name] = that.val(event.name)
@@ -172,7 +172,7 @@ module.exports = (HB)->
type: 'add'
name: event.name
oldValue: oldVal
changed_by:event.changed_by
changedBy:event.changedBy
@bound_json
#

View File

@@ -35,29 +35,31 @@ module.exports = (HB)->
if content?
if not @map[name]?
(new AddName undefined, @, name).execute()
## TODO: del this
if @map[name] == null
qqq = @
x = new AddName undefined, @, name
x.execute()
## endtodo
@map[name].replace content
@
else if name?
obj = @map[name]?.val()
if obj instanceof types.ImmutableObject
obj.val()
prop = @map[name]
if prop? and not prop.isContentDeleted()
obj = prop.val()
if obj instanceof types.ImmutableObject
obj.val()
else
obj
else
obj
undefined
else
result = {}
for name,o of @map
obj = o.val()
if obj instanceof types.ImmutableObject or obj instanceof MapManager
obj = obj.val()
result[name] = obj
if not o.isContentDeleted()
obj = o.val()
if obj instanceof types.ImmutableObject or obj instanceof MapManager
obj = obj.val()
result[name] = obj
result
delete: (name)->
@map[name]?.deleteContent()
@
#
# @nodoc
# When a new property in a map manager is created, then the uids of the inserted Operations
@@ -234,7 +236,9 @@ module.exports = (HB)->
# @param {Object} uid A unique identifier. If uid is undefined, a new uid will be created.
# @param {Delimiter} beginning Reference or Object.
# @param {Delimiter} end Reference or Object.
constructor: (@event_porperties, @event_this, uid, beginning, end, prev, next, origin)->
constructor: (@event_properties, @event_this, uid, beginning, end, prev, next, origin)->
if not @event_properties['object']?
@event_properties['object'] = @event_this
super uid, beginning, end, prev, next, origin
type: "ReplaceManager"
@@ -262,8 +266,8 @@ module.exports = (HB)->
#
callEventDecorator: (events)->
if not @isDeleted()
for name,prop of @event_porperties
for event in events
for event in events
for name,prop of @event_properties
event[name] = prop
@event_this.callEvent events
undefined
@@ -276,7 +280,15 @@ module.exports = (HB)->
#
replace: (content, replaceable_uid)->
o = @getLastOperation()
(new Replaceable content, @, replaceable_uid, o, o.next_cl).execute()
relp = (new Replaceable content, @, replaceable_uid, o, o.next_cl).execute()
# TODO: delete repl (for debugging)
undefined
isContentDeleted: ()->
@getLastOperation().isDeleted()
deleteContent: ()->
(new types.Delete undefined, @getLastOperation().uid).execute()
undefined
#
@@ -347,13 +359,14 @@ module.exports = (HB)->
@content
applyDelete: ()->
res = super
if @content?
if @next_cl.type isnt "Delimiter"
@content.deleteAllObservers()
@content.applyDelete()
@content.dontSync()
@content = null
super
res
cleanup: ()->
super
@@ -363,27 +376,35 @@ module.exports = (HB)->
# TODO: consider doing this in a more consistent manner. This could also be
# done with execute. But currently, there are no specital Insert-types for ListManager.
#
callOperationSpecificEvents: ()->
callOperationSpecificInsertEvents: ()->
if @next_cl.type is "Delimiter" and @prev_cl.type isnt "Delimiter"
# this replaces another Replaceable
old_value = @prev_cl.content
@prev_cl.applyDelete()
@parent.callEventDecorator [
type: "update"
changed_by: @uid.creator
changedBy: @uid.creator
oldValue: old_value
]
@prev_cl.applyDelete()
else if @next_cl.type isnt "Delimiter"
# This will never be recognized by the user, because another
# This won't be recognized by the user, because another
# concurrent operation is set as the current value of the RM
@applyDelete()
else # prev _and_ next are Delimiters. This is the first created Replaceable in the RM
@parent.callEventDecorator [
type: "add"
changed_by: @uid.creator
changedBy: @uid.creator
]
undefined
callOperationSpecificDeleteEvents: (o)->
if @next_cl.type is "Delimiter"
@parent.callEventDecorator [
type: "delete"
changedBy: o.uid.creator
oldValue: @content
]
#
# Encode this operation in such a way that it can be parsed by remote peers.
#