YearMonthTimeParserTest   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 189
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 4
dl 0
loc 189
rs 10
c 0
b 0
f 0

3 Methods

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