source: trunk/test/unit/dbnp/studycapturing/RelTimeTests.groovy @ 497

Last change on this file since 497 was 497, checked in by roberth, 11 years ago

Implemented RELTIME parsing and showing in the wizard.
Also made TEXT templatefields to show a textarea

File size: 8.1 KB
Line 
1package dbnp.studycapturing
2
3import grails.test.*
4
5/**
6 * RelTimeTests Test
7 *
8 * Description of my test
9 *
10 * @author  your email (+name?)
11 * @since       2010mmdd
12 * @package     ???
13 *
14 * Revision information:
15 * $Rev$
16 * $Author$
17 * $Date$
18 */
19class RelTimeTests extends GrailsUnitTestCase {
20    protected void setUp() {
21        super.setUp()
22    }
23
24    protected void tearDown() {
25        super.tearDown()
26    }
27
28    void testRelTimeCreation() {
29        def r = new RelTime();
30        assert r.getValue() == 0;
31       
32        r = new RelTime( 2000 );
33        assert r.getValue() == 2000;
34
35        r = new RelTime( "3h 20m" );
36        assert r.getValue() == 3 * 3600 + 20 * 60;
37    }
38
39    void testRelTimeSetAndGet() {
40        def r = new RelTime();
41
42        r.setValue( 1000 );
43        assert r.getValue() == 1000;
44
45        r.setValue( -1000 );
46        assert r.getValue() == -1000;
47
48        r.setValue(0);
49        assert r.getValue() == 0;
50
51        long century = 100L * 365 * 24 * 3600;
52        r.setValue( century );
53        assert r.getValue() == century;
54    }
55
56    // Tests the parsing of a string for relative dates
57    // @see TemplateEntity.setFieldValue
58    //
59        // The relative date may be set as a string, using the following format
60        //
61        //    #w #d #h #m #s
62        //
63        // Where w = weeks, d = days, h = hours, m = minutes, s = seconds
64        //
65        // The spaces between the values are optional. Every timespan
66        // (w, d, h, m, s) must appear at most once. You can also omit
67        // timespans if needed or use a different order.
68        // Other characters are disregarded, allthough results may not
69        // always be as expected.
70        //
71        // If an incorrect format is used, which can't be parsed
72        // an IllegalFormatException is thrown.
73        //
74        // An empty span is treated as zero seconds.
75        //
76        // Examples:
77        // ---------
78        //    5d 3h 20m     // 5 days, 3 hours and 20 minutes
79        //    6h 2d         // 2 days, 6 hours
80        //    10m 200s      // 13 minutes, 20 seconds (200s == 3m + 20s)
81        //    5w4h15m       // 5 weeks, 4 hours, 15 minutes
82        //
83        //    16x14w10d     // Incorrect. 16x is disregarded, so the
84        //                  // result is 15 weeks, 3 days
85        //    13days        // Incorrect: days should be d, but this is
86        //                  // parsed as 13d, 0 seconds
87        //
88    void testRelTimeParser() {
89        def s = 1L;
90        def m = 60L * s;
91        def h = 60L * m;
92        def d = 24L * h;
93        def w = 7L * d;
94
95        def r = new RelTime();
96
97        r.setValue( '' );
98        assert r.getValue() == 0;
99
100        r.setValue( '-' );
101        assert r.getValue() == 0;
102
103        r.setValue( '  ' );
104        assert r.getValue() == 0;
105
106        r.setValue( '5d 3h 20m' );
107        assert r.getValue() == 5 * d + 3 * h + 20 * m;
108        assert r.toString() == '5d 3h 20m';
109
110        r.setValue( '6h 2d' );
111        assert r.getValue() == 2 * d + 6 * h;
112        assert r.toString() == '2d 6h';
113
114        r.setValue( '10m 200s' );
115        assert r.getValue() == 10 * m  + 200 * s;
116        assert r.toString() == '13m 20s';
117
118        r.setValue( '1w 1s' );
119        assert r.getValue() == 1 * w + 1 * s;
120        assert r.toString() == '1w 1s';
121
122        // Test string without spaces
123        r.setValue( '5w4h15m' );
124        assert r.getValue() == 5 * w + 4 * h + 15 * m;
125        assert r.toString() == '5w 4h 15m';
126
127        // Test string with spaces between number and character
128        r.setValue( '5 w 4 h 15 m' );
129        assert r.getValue() == 5 * w + 4 * h + 15 * m;
130        assert r.toString() == '5w 4h 15m';
131
132        r.setValue( '5 weeks, 4 hours, 15 minutes' );
133        assert r.getValue() == 5 * w + 4 * h + 15 * m;
134        assert r.toString() == '5w 4h 15m';
135
136        // Test strings with commas
137        r.setValue( '5w, 4h, 15m' );
138        assert r.getValue() == 5 * w + 4 * h + 15 * m;
139        assert r.toString() == '5w 4h 15m';
140
141        r.setValue( '5w,4h,15m' );
142        assert r.getValue() == 5 * w + 4 * h + 15 * m;
143        assert r.toString() == '5w 4h 15m';
144
145        // Should parse correctly, allthough it is not completely correct
146        r.setValue( '5weeks, 4hours,15minutes' );
147        assert r.getValue() == 5 * w + 4 * h + 15 * m;
148        assert r.toString() == '5w 4h 15m';
149
150        r.setValue( '16x14w10d' );
151        assert r.getValue() == 14 * w + 10 * d;
152        assert r.toString() == '15w 3d';
153
154        r.setValue( '13days' );
155        assert r.getValue() == 13 * d;
156        assert r.toString() == '1w 6d';
157
158        // Test whether an IllegalFormatException is thrown
159        try {
160            r.setValue( 'nonexistent relative date' );
161            fail();
162        } catch(IllegalArgumentException ex) {
163        } catch( Exception ex ) {
164            fail();
165        }
166
167    }
168
169    void testNegativeRelTimes() {
170        def s = 1L;
171        def m = 60L * s;
172        def h = 60L * m;
173        def d = 24L * h;
174        def w = 7L * d;
175
176        def r = new RelTime();
177
178        r.setValue( -1000 );
179        assert r.getValue() == -1000;
180
181        r.setValue( -10 );
182        assert r.getValue() == -10;
183        assert r.toString() == "-10s"
184
185        r.setValue(-11 * d - 4 * h);
186        assert r.getValue() ==  -11* d - 4 * h;
187        assert r.toString() == "-1w 4d 4h";
188
189        r.setValue( "-5w 10d 4h" );
190        assert r.getValue() ==-5 * w - 10 * d - 4 * h;
191        assert r.toString() == '-6w 3d 4h';
192
193        r.setValue( "-1w 200m 1d" );
194        assert r.getValue() == -1 * w -200 * m - 1 * d;
195        assert r.toString() == '-1w 1d 3h 20m';
196
197    }
198
199    void testComputeDifference() {
200        def s = 1L;
201        def m = 60L * s;
202        def h = 60L * m;
203        def d = 24L * h;
204        def w = 7L * d;
205
206        def r = new RelTime();
207
208        r.computeDifference(
209            new Date( 2010, 1, 1, 10, 0, 0 ),
210            new Date( 2010, 1, 1, 20, 10, 0 )
211        );
212        assert r.getValue() == 10 * h + 10 * m;
213
214        r.computeDifference(
215            new Date( 2010, 1, 1, 10, 0, 0 ),
216            new Date( 2011, 1, 1, 10, 10, 0 )
217        );
218        assert r.getValue() == 365 * d + 10 * m;
219        assert r.toString() == "52w 1d 10m";
220
221        // Test leap year
222        r.computeDifference(
223            new Date( 2008, 1, 1, 10, 0, 0 ),
224            new Date( 2009, 1, 1, 10, 0, 0 )
225        );
226        assert r.getValue() == 366 * d;
227
228        // Test daylight saving time. Dates are expected to be UTC
229        // Mar 27 - Mar 29
230        r.computeDifference(
231            new Date( 2010, 2, 27, 10, 0, 0 ),
232            new Date( 2010, 2, 29, 10, 0, 0 )
233        );
234        assert r.getValue() == 2 * d;
235
236        // Test daylight saving time. Dates are expected to be UTC
237        // Oct 30 - Nov 1
238        r.computeDifference(
239            new Date( 2010, 9 , 30, 10, 0, 0 ),
240            new Date( 2010, 10,  1, 10, 0, 0 )
241        );
242        assert r.getValue() == 2 * d;
243
244        // Test negative differences
245        r.computeDifference(
246            new Date( 2010, 1, 2, 10, 0, 0 ),
247            new Date( 2010, 1, 1, 10, 0, 0 )
248        );
249        assert r.getValue() == -1 * d;
250        assert r.toString() == "-1d";
251
252    }
253
254    void testPrettyString() {
255        def r = new RelTime();
256
257        r.setValue( "5w 10d 4h 3m 10s" );
258        assert r.toString() == '6w 3d 4h 3m 10s';
259        assert r.toPrettyString() == '6 weeks, 3 days, 4 hours, 3 minutes, 10 seconds';
260        assert r.toPrettyRoundedString() == '6 weeks';
261
262        r.setValue( "1w 30s" );
263        assert r.toString() == '1w 30s';
264        assert r.toPrettyString() == '1 week, 30 seconds';
265        assert r.toPrettyRoundedString() == '1 week';
266
267        r.setValue( "" );
268        assert r.toString() == '';
269        assert r.toPrettyString() == '';
270        assert r.toPrettyRoundedString() == '';
271
272        r.setValue( -1000 );
273        assert r.toPrettyString() == "-16 minutes, 40 seconds";
274        assert r.toPrettyRoundedString() == "-16 minutes";
275
276    }
277}
Note: See TracBrowser for help on using the repository browser.