001    /*
002     * Copyright 2002-2008 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.binding.value.support;
017    
018    import junit.framework.TestCase;
019    
020    import org.easymock.EasyMock;
021    import org.springframework.binding.value.ValueChangeDetector;
022    import org.springframework.rules.closure.Closure;
023    import org.springframework.richclient.application.ApplicationServices;
024    import org.springframework.richclient.application.ApplicationServicesLocator;
025    
026    /**
027     * Testcase for <code>RefreshableValueHolder</code>
028     * 
029     * @author Peter De Bruycker
030     */
031    public class RefreshableValueHolderTests extends TestCase {
032        public void testWithLazyInitTrueAndAlwaysRefreshFalse() {
033            Object returnValue = new Object();
034    
035            Closure refreshFunction = (Closure) EasyMock.createMock(Closure.class);
036            EasyMock.expect(refreshFunction.call(null)).andReturn(returnValue);
037            EasyMock.replay(refreshFunction);
038    
039            RefreshableValueHolder valueHolder = new RefreshableValueHolder(refreshFunction);
040            // lazy init
041            assertNull(valueHolder.getValue());
042            valueHolder.refresh();
043            assertSame(returnValue, valueHolder.getValue());
044    
045            EasyMock.verify(refreshFunction);
046        }
047    
048        public void testWithLazyInitFalseAndAlwaysRefreshFalse() {
049            Object returnValue = new Object();
050    
051            Closure refreshFunction = (Closure) EasyMock.createMock(Closure.class);
052            EasyMock.expect(refreshFunction.call(null)).andReturn(returnValue);
053            EasyMock.replay(refreshFunction);
054    
055            RefreshableValueHolder valueHolder = new RefreshableValueHolder(refreshFunction, false, false);
056            assertSame(returnValue, valueHolder.getValue());
057    
058            EasyMock.verify(refreshFunction);
059        }
060    
061        public void testWithLazyInitFalseAndAlwaysRefreshTrue() {
062            Object returnValue1 = new Object();
063            Object returnValue2 = new Object();
064            Object returnValue3 = new Object();
065    
066            Closure refreshFunction = (Closure) EasyMock.createMock(Closure.class);
067            EasyMock.expect(refreshFunction.call(null)).andReturn(returnValue1);
068            EasyMock.expect(refreshFunction.call(null)).andReturn(returnValue2);
069            EasyMock.expect(refreshFunction.call(null)).andReturn(returnValue3);
070            EasyMock.replay(refreshFunction);
071    
072            RefreshableValueHolder valueHolder = new RefreshableValueHolder(refreshFunction, true, true);
073            assertSame(returnValue1, valueHolder.getValue());
074            assertSame(returnValue2, valueHolder.getValue());
075            assertSame(returnValue3, valueHolder.getValue());
076    
077            EasyMock.verify(refreshFunction);
078        }
079    
080        protected void setUp() throws Exception {
081            ApplicationServices services = new ApplicationServices() {
082    
083                public Object getService(Class serviceType) {
084                    return new DefaultValueChangeDetector();
085                }
086    
087                public boolean containsService(Class serviceType) {
088                    return ValueChangeDetector.class.equals(serviceType);
089                }
090    
091            };
092            ApplicationServicesLocator.load(new ApplicationServicesLocator(services));
093        }
094    }