Completed
Pull Request — master (#134)
by no
07:39 queued 01:13
created

YearMonthTimeParserTest::getParserClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace ValueParsers\Test;
4
5
use DataValues\TimeValue;
6
use ValueParsers\YearMonthTimeParser;
7
8
/**
9
 * @covers ValueParsers\YearMonthTimeParser
10
 *
11
 * @group DataValue
12
 * @group DataValueExtensions
13
 * @group TimeParsers
14
 * @group ValueParsers
15
 *
16
 * @license GPL-2.0+
17
 * @author Addshore
18
 * @author Thiemo Mättig
19
 */
20
class YearMonthTimeParserTest extends StringValueParserTest {
21
22
	/**
23
	 * @see ValueParserTestBase::getInstance
24
	 *
25
	 * @return YearMonthTimeParser
26
	 */
27
	protected function getInstance() {
28
		$monthNameProvider = $this->getMockBuilder( 'ValueParsers\MonthNameProvider' )
29
			->disableOriginalConstructor()
30
			->getMock();
31
		$monthNameProvider->expects( $this->once() )
32
			->method( 'getMonthNumbers' )
33
			->with( 'en' )
34
			->will( $this->returnValue( array(
35
				'January' => 1,
36
				'Jan' => 1,
37
				'April' => 4,
38
				'June' => 6,
39
			) ) );
40
41
		return new YearMonthTimeParser( $monthNameProvider );
42
	}
43
44
	/**
45
	 * @see ValueParserTestBase::validInputProvider
46
	 */
47
	public function validInputProvider() {
48
		$gregorian = 'http://www.wikidata.org/entity/Q1985727';
49
		$julian = 'http://www.wikidata.org/entity/Q1985786';
50
51
		$argLists = array();
52
53
		$valid = array(
54
			// Whitespace
55
			"January 2016\n" =>
56
				array( '+2016-01-00T00:00:00Z' ),
57
			' January 2016 ' =>
58
				array( '+2016-01-00T00:00:00Z' ),
59
60
			// leading zeros
61
			'1 00001999' =>
62
				array( '+1999-01-00T00:00:00Z' ),
63
			'1 0000000100001999' =>
64
				array( '+100001999-01-00T00:00:00Z' ),
65
66
			// Negative years
67
			'4 -1998' =>
68
				array( '-1998-04-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
69
			'April -1998' =>
70
				array( '-1998-04-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
71
			'-1998 4' =>
72
				array( '-1998-04-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
73
			'-1998 April' =>
74
				array( '-1998-04-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
75
76
			// use string month names
77
			'Jan/1999' =>
78
				array( '+1999-01-00T00:00:00Z' ),
79
			'January/1999' =>
80
				array( '+1999-01-00T00:00:00Z' ),
81
			'January/1' =>
82
				array( '+0001-01-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
83
			'1999 January' =>
84
				array( '+1999-01-00T00:00:00Z' ),
85
			'January 1999' =>
86
				array( '+1999-01-00T00:00:00Z' ),
87
			'January-1' =>
88
				array( '+0001-01-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
89
			'JanuARY-1' =>
90
				array( '+0001-01-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
91
			'JaN/1999' =>
92
				array( '+1999-01-00T00:00:00Z' ),
93
			'januARY-1' =>
94
				array( '+0001-01-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
95
			'jan/1999' =>
96
				array( '+1999-01-00T00:00:00Z' ),
97
98
			// use different date separators
99
			'1-1999' =>
100
				array( '+1999-01-00T00:00:00Z' ),
101
			'1/1999' =>
102
				array( '+1999-01-00T00:00:00Z' ),
103
			'1 / 1999' =>
104
				array( '+1999-01-00T00:00:00Z' ),
105
			'1 1999' =>
106
				array( '+1999-01-00T00:00:00Z' ),
107
			'1,1999' =>
108
				array( '+1999-01-00T00:00:00Z' ),
109
			'1.1999' =>
110
				array( '+1999-01-00T00:00:00Z' ),
111
			'1. 1999' =>
112
				array( '+1999-01-00T00:00:00Z' ),
113
114
			// presume mm/yy unless impossible month, in which case switch
115
			'12/12' =>
116
				array( '+0012-12-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
117
			'12/11' =>
118
				array( '+0011-12-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
119
			'11/12' =>
120
				array( '+0012-11-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
121
			'13/12' =>
122
				array( '+0013-12-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
123
			'12/13' =>
124
				array( '+0013-12-00T00:00:00Z', TimeValue::PRECISION_MONTH, $julian ),
125
			'2000 1' =>
126
				array( '+2000-01-00T00:00:00Z' ),
127
128
			// big years
129
			'April-1000000001' =>
130
				array( '+1000000001-04-00T00:00:00Z' ),
131
			'April 1000000001' =>
132
				array( '+1000000001-04-00T00:00:00Z' ),
133
			'1000000001 April' =>
134
				array( '+1000000001-04-00T00:00:00Z' ),
135
			'1 13000' =>
136
				array( '+13000-01-00T00:00:00Z' ),
137
138
			// parse 0 month as if no month has been entered
139
			'0.1999' =>
140
				array( '+1999-00-00T00:00:00Z', TimeValue::PRECISION_YEAR ),
141
			'1999 0' =>
142
				array( '+1999-00-00T00:00:00Z', TimeValue::PRECISION_YEAR ),
143
		);
144
145
		foreach ( $valid as $value => $expected ) {
146
			$timestamp = $expected[0];
147
			$precision = isset( $expected[1] ) ? $expected[1] : TimeValue::PRECISION_MONTH;
148
			$calendarModel = isset( $expected[2] ) ? $expected[2] : $gregorian;
149
150
			$argLists[] = array(
151
				(string)$value,
152
				new TimeValue( $timestamp, 0, 0, 0, $precision, $calendarModel )
153
			);
154
		}
155
156
		return $argLists;
157
	}
158
159
	/**
160
	 * @see StringValueParserTest::invalidInputProvider
161
	 */
162
	public function invalidInputProvider() {
163
		$argLists = parent::invalidInputProvider();
164
165
		$invalid = array(
166
			// These are just wrong
167
			'June June June',
168
			'June June',
169
			'111 111 111',
170
			'Jann 2014',
171
			'13/13',
172
			'13,1999',
173
			'1999,13',
174
			"12 1950\n12",
175
176
			// Months with signs or more than two digits are most probably not a month
177
			'-0 1999',
178
			'-4 1999',
179
			'-4 -1999',
180
			'-April 1998',
181
			'000 1999',
182
			'012 1999',
183
			'00001 1999',
184
			'000000001 100001999',
185
186
			// Dont parse stuff with separators in the year
187
			'june 200,000,000',
188
			'june 200.000.000',
189
190
			// Not within the scope of this parser
191
			'1 June 20000',
192
			'20000',
193
			'-1998',
194
195
			// BCE is not supported yet
196
			'April 1998 BCE',
197
			'1998 April BCE',
198
			'1998 BCE April',
199
		);
200
201
		foreach ( $invalid as $value ) {
202
			$argLists[] = array( $value );
203
		}
204
205
		return $argLists;
206
	}
207
208
}
209