001 /*
002 * Copyright 2002-2007 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.richclient.form.binding.swing.date;
017
018 import java.util.Calendar;
019 import java.util.Date;
020 import java.util.HashMap;
021 import java.util.Map;
022
023 import javax.swing.JComponent;
024
025 import org.springframework.binding.form.FieldMetadata;
026 import org.springframework.richclient.form.binding.swing.BindingAbstractTests;
027
028 /**
029 * Skeleton test for <code>AbstractDateFieldBinder</code> and
030 * <code>AbstractDateFieldBinding</code> subclasses.
031 *
032 * @author Geoffrey De Smet
033 * @author Peter De Bruycker
034 */
035 public abstract class AbstractDateFieldBindingTestCase extends BindingAbstractTests {
036
037 private AbstractDateFieldBinder binder;
038
039 private AbstractDateFieldBinding binding;
040
041 private JComponent dateField;
042
043 protected String setUpBinding() {
044 Map context = new HashMap();
045
046 binder = createBinder();
047 binding = (AbstractDateFieldBinding) binder.bind(fm, "dateProperty", context);
048 dateField = binding.getControl();
049
050 return "dateProperty";
051 }
052
053 protected abstract AbstractDateFieldBinder createBinder();
054
055 public void testInitialValue() {
056 Date date = createDate(1981, 10, 16);
057 vm.setValue(date);
058 assertNotNull(vm.getValue());
059 }
060
061 private Date createDate(int year, int month, int day) {
062 Calendar calendar = Calendar.getInstance();
063 calendar.set(year, month, day, 0, 0, 0);
064 Date date = calendar.getTime();
065 return date;
066 }
067
068 public final void testComponentTracksEnabledChanges() {
069 assertEquals(true, dateField.isEnabled());
070 fm.setEnabled(false);
071 assertEquals(false, dateField.isEnabled());
072 fm.setEnabled(true);
073 assertEquals(true, dateField.isEnabled());
074 }
075
076 public final void testComponentTracksReadOnlyChanges() {
077 FieldMetadata state = fm.getFieldMetadata("dateProperty");
078 assertEquals(true, !isReadOnly(dateField));
079 state.setReadOnly(true);
080 assertEquals(false, !isReadOnly(dateField));
081 state.setReadOnly(false);
082 assertEquals(true, !isReadOnly(dateField));
083 }
084
085 protected abstract boolean isReadOnly(JComponent dateField);
086
087 protected abstract Date getValue(JComponent dateField);
088
089 protected abstract void setValue(JComponent dateField, Date date);
090
091 public final void testComponentUpdatesValueModel() {
092 Date date1 = createDate(1981, 10, 16);
093 setValue(dateField, date1);
094 assertEquals(date1, (Date)vm.getValue());
095 setValue(dateField, null);
096 assertEquals(null, (Date)vm.getValue());
097 Date date2 = createDate(1999, 11, 31);
098 setValue(dateField, date2);
099 assertEquals(date2, (Date)vm.getValue());
100 }
101
102 public final void testValueModelUpdatesComponent() {
103 Date date1 = createDate(1981, 10, 16);
104 vm.setValue(date1);
105 assertEquals(date1, getValue(dateField));
106 vm.setValue(null);
107 assertEquals(null, getValue(dateField));
108 Date date2 = createDate(1999, 11, 31);
109 vm.setValue(date2);
110 assertEquals(date2, getValue(dateField));
111 }
112
113 /*
114 * trim the dates to seconds
115 */
116 protected void assertEquals(Date date1, Date date2) {
117 if(date1 == null || date2 == null) {
118 super.assertEquals(date1, date2);
119 return;
120 }
121
122 long l1 = date1.getTime();
123 l1 = ((long)Math.round(l1/1000))*1000;
124 long l2 = date2.getTime();
125 l2 = ((long)Math.round(l1/1000))*1000;
126
127 assertEquals(l1, l2);
128 }
129 }