blob: dc9b8dda7068897a651a76ef25ffccad932c221c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package groovy.util
import groovy.test.GroovyTestCase
import java.beans.PropertyChangeEvent
import java.beans.PropertyChangeListener
class ObservableMapTest extends GroovyTestCase {
void testFireEvent_withoutTest() {
def map = new ObservableMap()
def propertyListener = new SamplePropertyChangeListener()
map.addPropertyChangeListener(propertyListener)
def sizeListener = new SamplePropertyChangeListener(false)
map.addPropertyChangeListener(ObservableMap.SIZE_PROPERTY, sizeListener)
def key = 'key'
def value1 = 'value1'
def value2 = 'value2'
map[key] = null
assertNotNull(propertyListener.event)
assertTrue(propertyListener.event instanceof ObservableMap.PropertyAddedEvent)
assertEquals(key, propertyListener.event.propertyName)
assertNull(propertyListener.event.oldValue)
assertNull(propertyListener.event.newValue)
assert sizeListener.event
assert 0 == sizeListener.event.oldValue
assert 1 == sizeListener.event.newValue
sizeListener.event = null
map[key] = value1
assertNotNull(propertyListener.event)
assertEquals(map, propertyListener.event.source)
assertEquals(key, propertyListener.event.propertyName)
assertNull(propertyListener.event.oldValue)
assertEquals(value1, propertyListener.event.newValue)
assert !sizeListener.event
map[key] = value2
assertNotNull(propertyListener.event)
assertEquals(map, propertyListener.event.source)
assertEquals(key, propertyListener.event.propertyName)
assertEquals(value1, propertyListener.event.oldValue)
assertEquals(value2, propertyListener.event.newValue)
assert !sizeListener.event
propertyListener.event = null
map[key] = value2
assertNull(propertyListener.event)
}
void testFireEvent_removeKey() {
def map = new ObservableMap()
def propertyListener = new SamplePropertyChangeListener()
map.addPropertyChangeListener(propertyListener)
def sizeListener = new SamplePropertyChangeListener(false)
map.addPropertyChangeListener(ObservableMap.SIZE_PROPERTY, sizeListener)
def key = 'key'
def value1 = 'value1'
def value2 = 'value2'
map[key] = null
assertNotNull(propertyListener.event)
assertTrue(propertyListener.event instanceof ObservableMap.PropertyAddedEvent)
assertEquals(key, propertyListener.event.propertyName)
assertNull(propertyListener.event.newValue)
assert sizeListener.event
assert 0 == sizeListener.event.oldValue
assert 1 == sizeListener.event.newValue
sizeListener.event = null
map[key] = value1
assertNotNull(propertyListener.event)
assertEquals(map, propertyListener.event.source)
assertEquals(key, propertyListener.event.propertyName)
assertNull(propertyListener.event.oldValue)
assertEquals(value1, propertyListener.event.newValue)
assert !sizeListener.event
map.remove(key)
assertNotNull(propertyListener.event)
assertTrue(propertyListener.event instanceof ObservableMap.PropertyRemovedEvent)
assertEquals(map, propertyListener.event.source)
assertEquals(key, propertyListener.event.propertyName)
assertEquals(value1, propertyListener.event.oldValue)
assert sizeListener.event
assert 1 == sizeListener.event.oldValue
assert 0 == sizeListener.event.newValue
}
void testFireEvent_clearMap() {
def map = new ObservableMap()
def propertyListener = new SamplePropertyChangeListener()
map.addPropertyChangeListener(propertyListener)
def sizeListener = new SamplePropertyChangeListener(false)
map.addPropertyChangeListener(ObservableMap.SIZE_PROPERTY, sizeListener)
def key1 = 'key1'
def key2 = 'key2'
def value1 = 'value1'
def value2 = 'value2'
map[key1] = value1
map[key2] = value2
assert sizeListener.event
assert 1 == sizeListener.event.oldValue
assert 2 == sizeListener.event.newValue
map.clear()
assertNotNull(propertyListener.event)
assert propertyListener.event instanceof ObservableMap.PropertyClearedEvent
assertEquals(map, propertyListener.event.source)
def values = propertyListener.event.values
assertNotNull(values)
assertEquals(2, values.size())
assertEquals(value1, values[key1])
assertEquals(value2, values[key2])
assert sizeListener.event
assert 2 == sizeListener.event.oldValue
assert 0 == sizeListener.event.newValue
}
void testFireEvent_putAll() {
def map = new ObservableMap()
def propertyListener = new SamplePropertyChangeListener()
map.addPropertyChangeListener(propertyListener)
def sizeListener = new SamplePropertyChangeListener(false)
map.addPropertyChangeListener(ObservableMap.SIZE_PROPERTY, sizeListener)
def key1 = 'key1'
def key2 = 'key2'
def value1 = 'value1'
def value2 = 'value2'
map[key1] = null
assert sizeListener.event
assert 0 == sizeListener.event.oldValue
assert 1 == sizeListener.event.newValue
map.putAll([key1: value1, key2: value2])
assertNotNull(propertyListener.event)
assert propertyListener.event instanceof ObservableMap.MultiPropertyEvent
assertEquals(map, propertyListener.event.source)
assertEquals(2, propertyListener.event.events.size())
assertTrue(propertyListener.event.events[0] instanceof ObservableMap.PropertyUpdatedEvent)
assertEquals(key1, propertyListener.event.events[0].propertyName)
assertEquals(value1, propertyListener.event.events[0].newValue)
assertTrue(propertyListener.event.events[1] instanceof ObservableMap.PropertyAddedEvent)
assertEquals(key2, propertyListener.event.events[1].propertyName)
assertEquals(value2, propertyListener.event.events[1].newValue)
assert sizeListener.event
assert 1 == sizeListener.event.oldValue
assert 2 == sizeListener.event.newValue
}
void testFireEvent_withTest() {
def map = new ObservableMap({ it != 'value2' })
def propertyListener = new SamplePropertyChangeListener()
map.addPropertyChangeListener(propertyListener)
def sizeListener = new SamplePropertyChangeListener(false)
map.addPropertyChangeListener(ObservableMap.SIZE_PROPERTY, sizeListener)
def key = 'key'
def value1 = 'value1'
def value2 = 'value2'
map[key] = value1
assertNotNull(propertyListener.event)
assertEquals(map, propertyListener.event.source)
assertEquals(key, propertyListener.event.propertyName)
assertEquals(value1, propertyListener.event.newValue)
propertyListener.event = null
map[key] = value2
assertNull(propertyListener.event)
}
void testFireEvent_withTestOnKey() {
def map = new ObservableMap({ name, value -> name != 'key' })
def propertyListener = new SamplePropertyChangeListener()
map.addPropertyChangeListener(propertyListener)
def sizeListener = new SamplePropertyChangeListener(false)
map.addPropertyChangeListener(ObservableMap.SIZE_PROPERTY, sizeListener)
def key = 'key'
def value1 = 'value1'
def value2 = 'value2'
map[key] = value1
assertNull(propertyListener.event)
map[key] = value2
assertNull(propertyListener.event)
map['key2'] = value1
assertNotNull(propertyListener.event)
assertEquals(map, propertyListener.event.source)
assertEquals('key2', propertyListener.event.propertyName)
assertEquals(value1, propertyListener.event.newValue)
}
}
class SamplePropertyChangeListener implements PropertyChangeListener {
PropertyChangeEvent event
private final boolean skip
SamplePropertyChangeListener() {
this(true)
}
SamplePropertyChangeListener(boolean skip) {
this.skip = skip;
}
void propertyChange(PropertyChangeEvent evt) {
if (skip && evt.propertyName in [ObservableMap.SIZE_PROPERTY]) return
event = evt
}
}