A few improvements for ChunkBuffer
* insert available items at once * allow to use pushObject on buffer itself * add a test using arrayObserver to make sure that it fires only when elements are added to arrangedContent
This commit is contained in:
parent
d549831c22
commit
b4022f5f67
|
@ -1,4 +1,5 @@
|
|||
require 'travis/model'
|
||||
require 'travis/chunk_buffer'
|
||||
|
||||
@Travis.Artifact = Em.Object.extend
|
||||
version: 1 # used to refresh log on requeue
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Travis.ChunkBuffer = Em.ArrayProxy.extend
|
||||
Travis.ChunkBuffer = Em.ArrayProxy.extend Ember.MutableEnumerable,
|
||||
timeout: 15000
|
||||
start: 0
|
||||
next: 0
|
||||
|
@ -6,6 +6,8 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
|
|||
init: ->
|
||||
@_super.apply this, arguments
|
||||
|
||||
@set('next', @get('start'))
|
||||
|
||||
if @get('content.length')
|
||||
@get('queue.content').pushObjects @get('content').toArray()
|
||||
|
||||
|
@ -13,6 +15,15 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
|
|||
[]
|
||||
).property('content')
|
||||
|
||||
addObject: (obj) ->
|
||||
@get('content').pushObject(obj)
|
||||
|
||||
removeObject: (obj) ->
|
||||
@get('content').removeObject(obj)
|
||||
|
||||
replaceContent: (idx, amt, objects) ->
|
||||
@get('content').replace(idx, amt, objects)
|
||||
|
||||
queue: (->
|
||||
Em.ArrayProxy.create(Em.SortableMixin,
|
||||
content: []
|
||||
|
@ -35,9 +46,12 @@ Travis.ChunkBuffer = Em.ArrayProxy.extend
|
|||
next = @get('next')
|
||||
|
||||
arrangedContent = @get('arrangedContent')
|
||||
toPush = []
|
||||
|
||||
while queue.get('firstObject.number') == next
|
||||
arrangedContent.pushObject queue.shiftObject().get('content')
|
||||
toPush.pushObject queue.shiftObject().get('content')
|
||||
next += 1
|
||||
|
||||
arrangedContent.pushObjects toPush if toPush.length
|
||||
|
||||
@set('next', next)
|
||||
|
|
|
@ -3,15 +3,14 @@ createChunk = (number, content) ->
|
|||
|
||||
describe 'Travis.ChunkBuffer', ->
|
||||
it 'waits for parts to be in order before revealing them', ->
|
||||
content = []
|
||||
buffer = Travis.ChunkBuffer.create(content: content)
|
||||
buffer = Travis.ChunkBuffer.create(content: [])
|
||||
|
||||
content.pushObject createChunk(2, "baz")
|
||||
content.pushObject createChunk(1, "bar")
|
||||
buffer.pushObject createChunk(2, "baz")
|
||||
buffer.pushObject createChunk(1, "bar")
|
||||
|
||||
expect(buffer.get('length')).toEqual(0)
|
||||
|
||||
content.pushObject createChunk(0, "foo")
|
||||
buffer.pushObject createChunk(0, "foo")
|
||||
|
||||
expect(buffer.get('length')).toEqual(3)
|
||||
|
||||
|
@ -20,14 +19,13 @@ describe 'Travis.ChunkBuffer', ->
|
|||
it 'ignores a part if it fails to be delivered within timeout', ->
|
||||
expect 4
|
||||
|
||||
content = []
|
||||
buffer = Travis.ChunkBuffer.create(content: content, timeout: 10)
|
||||
buffer = Travis.ChunkBuffer.create(content: [], timeout: 10)
|
||||
|
||||
content.pushObject createChunk(2, "baz")
|
||||
buffer.pushObject createChunk(2, "baz")
|
||||
|
||||
expect(buffer.get('length')).toEqual(0)
|
||||
|
||||
content.pushObject createChunk(0, "foo")
|
||||
buffer.pushObject createChunk(0, "foo")
|
||||
|
||||
expect(buffer.get('length')).toEqual(1)
|
||||
|
||||
|
@ -44,9 +42,39 @@ describe 'Travis.ChunkBuffer', ->
|
|||
|
||||
expect(buffer.get('length')).toEqual(0)
|
||||
|
||||
content.pushObject createChunk(0, "foo")
|
||||
buffer.pushObject createChunk(0, "foo")
|
||||
|
||||
expect(buffer.get('length')).toEqual(2)
|
||||
expect(buffer.toArray()).toEqual(['foo', 'bar'])
|
||||
|
||||
it 'fires array observers properly', ->
|
||||
changes = []
|
||||
buffer = Travis.ChunkBuffer.create(content: [])
|
||||
|
||||
observer = Em.Object.extend(
|
||||
init: ->
|
||||
@_super.apply this, arguments
|
||||
|
||||
@get('content').addArrayObserver this,
|
||||
willChange: 'arrayWillChange',
|
||||
didChange: 'arrayDidChange'
|
||||
|
||||
arrayWillChange: (->)
|
||||
arrayDidChange: (array, index, removedCount, addedCount) ->
|
||||
changes.pushObject([index, addedCount])
|
||||
).create(content: buffer)
|
||||
|
||||
buffer.pushObject createChunk(1, "baz")
|
||||
|
||||
expect(buffer.get('length')).toEqual(0)
|
||||
expect(changes.length).toEqual(0)
|
||||
|
||||
buffer.pushObject createChunk(0, "foo")
|
||||
|
||||
expect(buffer.get('length')).toEqual(2)
|
||||
expect(changes.length).toEqual(1)
|
||||
expect(changes[0]).toEqual([0, 2])
|
||||
|
||||
it 'sets next to start if start is given at init', ->
|
||||
buffer = Travis.ChunkBuffer.create(content: [], start: 5)
|
||||
expect(buffer.get('next')).toEqual(5)
|
||||
|
|
Loading…
Reference in New Issue
Block a user