|
describe('patternAdapter', function() { |
|
|
|
it('compiles the correct pattern when patterns are listened to', function(){ |
|
|
|
bus('newListener').emit( 'node:test_pattern'); |
|
|
|
expect( jsonPathCompiler ).toHaveBeenCalledWith('test_pattern'); |
|
}) |
|
|
|
it('listens for NODE_FOUND events when node:pattern is added', function(){ |
|
|
|
bus('newListener').emit( 'node:test_pattern'); |
|
|
|
expect(bus(NODE_FOUND).on) |
|
.toHaveBeenCalledWith( |
|
jasmine.any(Function) |
|
, 'node:test_pattern' |
|
) |
|
}) |
|
|
|
it('does not listen for NODE_FOUND events second time same node:pattern is added', function(){ |
|
|
|
bus('newListener').emit( 'node:test_pattern'); |
|
bus('newListener').emit( 'node:test_pattern'); |
|
|
|
expect(bus(NODE_FOUND).on.calls.length).toBe(1); |
|
}) |
|
|
|
it('stops listening for node events when node:pattern is removed again', function(){ |
|
|
|
bus('node:test_pattern').on( noop); |
|
bus('node:test_pattern').un( noop); |
|
|
|
expect(bus(NODE_FOUND).un) |
|
.toHaveBeenCalledWith( |
|
'node:test_pattern' |
|
) |
|
}) |
|
|
|
it('starts listening again for node events when node:pattern is added, removed and added again', function(){ |
|
|
|
bus('node:test_pattern').on( noop); |
|
|
|
expect(bus(NODE_FOUND).on.calls.length).toBe(1); |
|
|
|
bus('node:test_pattern').on( noop); |
|
|
|
expect(bus(NODE_FOUND).on.calls.length).toBe(1); |
|
|
|
bus('node:test_pattern').un( noop); |
|
|
|
expect(bus(NODE_FOUND).un.calls.length).toBe(0); |
|
|
|
bus('node:test_pattern').un( noop); |
|
|
|
expect(bus(NODE_FOUND).un.calls.length).toBe(1); |
|
|
|
bus('node:test_pattern').on( noop); |
|
|
|
expect(bus(NODE_FOUND).on.calls.length).toBe(2); |
|
}) |
|
|
|
it('doesn\'t stop listening is there are still other node:pattern listeners', function(){ |
|
|
|
bus('node:test_pattern').on( noop); |
|
bus('node:test_pattern').on( noop); |
|
bus('node:test_pattern').un( noop); |
|
|
|
expect(bus(NODE_FOUND).un) |
|
.not.toHaveBeenCalledWith( |
|
'node:test_pattern' |
|
) |
|
}) |
|
|
|
it('doesn\'t stop listening if a different pattern is unsubscribed from', function(){ |
|
|
|
bus('node:test_pattern').on( noop); |
|
bus('node:other_test_pattern').on( noop); |
|
bus('node:other_test_pattern').un( noop); |
|
|
|
expect(bus(NODE_FOUND).un) |
|
.not.toHaveBeenCalledWith( |
|
'node:test_pattern' |
|
) |
|
}) |
|
|
|
it('doesn\'t stop listening if wrong event type is unsubscribed', function(){ |
|
|
|
bus('node:test_pattern').on( noop); |
|
bus('path:test_pattern').on( noop); |
|
bus('path:test_pattern').un( noop); |
|
|
|
expect(bus(NODE_FOUND).un) |
|
.not.toHaveBeenCalledWith( |
|
'node:test_pattern' |
|
) |
|
}) |
|
|
|
it('only listens once to NODE_FOUND when same pattern is added twice', function(){ |
|
|
|
bus('node:test_pattern').on( noop); |
|
bus('node:test_pattern').on( noop); |
|
|
|
expect( listAsArray( bus(NODE_FOUND).listeners ).length ).toBe(1); |
|
}) |
|
|
|
it('listens to NODE_FOUND and PATH_FOUND when given node: and path: listeners', function(){ |
|
|
|
bus('node:test_pattern').on( noop); |
|
bus('path:test_pattern').on( noop); |
|
|
|
expect(bus(NODE_FOUND).on) |
|
.toHaveBeenCalledWith( |
|
jasmine.any(Function) |
|
, 'node:test_pattern' |
|
) |
|
|
|
expect(bus(PATH_FOUND).on) |
|
.toHaveBeenCalledWith( |
|
jasmine.any(Function) |
|
, 'path:test_pattern' |
|
) |
|
}) |
|
|
|
it('fires node:pattern events when match is found', function(){ |
|
|
|
var ascent = anAscentMatching('test_pattern'); |
|
|
|
bus('node:test_pattern').on( noop); |
|
|
|
bus(NODE_FOUND).emit( ascent); |
|
|
|
expect( bus('node:test_pattern').emit ).toHaveBeenCalled(); |
|
}) |
|
|
|
it('fires gives node:pattern the node, path ' + |
|
'and ancestors from the given ascent', function(){ |
|
|
|
var testJson = {animals:{mammals:{humans:'hi there!'}}}, |
|
ascent = anAscentMatching('test_pattern', testJson); |
|
|
|
bus('node:test_pattern').on(noop); |
|
|
|
bus(NODE_FOUND).emit( ascent); |
|
|
|
expect( bus('node:test_pattern').emit ) |
|
.toHaveBeenCalledWith( |
|
'hi there!', |
|
[ 'animals', 'mammals', 'humans'], |
|
[ testJson, |
|
testJson.animals, |
|
testJson.animals.mammals, |
|
testJson.animals.mammals.humans |
|
] |
|
); |
|
}) |
|
|
|
|
|
|
|
|
|
|
|
var bus, matches, jsonPathCompiler; |
|
|
|
beforeEach(function(){ |
|
|
|
matches = {}; |
|
|
|
bus = spiedPubSub(); |
|
|
|
jsonPathCompiler = jasmine.createSpy('jsonPathCompiler').andCallFake( |
|
function (pattern){ |
|
|
|
function compiled ( ascent ){ |
|
if( matches[pattern] === ascent ) { |
|
return head(ascent); |
|
} else { |
|
return false; |
|
} |
|
} |
|
|
|
return compiled; |
|
} |
|
); |
|
|
|
patternAdapter(bus, jsonPathCompiler); |
|
}) |
|
|
|
function anAscentMatching(pattern, json) { |
|
var ascent |
|
|
|
if( json ) { |
|
ascent = ascentFrom(json); |
|
} else { |
|
ascent = list(namedNode('node', {})); |
|
} |
|
|
|
matches[pattern] = ascent; |
|
|
|
return ascent; |
|
} |
|
|
|
}); |