Skip to content

Commit d65db3f

Browse files
committed
Tests compiling; lots of docs tests
1 parent 40f70a0 commit d65db3f

21 files changed

+430
-157
lines changed

components/calendar/benches/date.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,22 @@ pub struct Test {
2020
use criterion::{
2121
black_box, criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion,
2222
};
23-
use icu_calendar::{AsCalendar, Calendar, Date, DateDuration};
23+
use icu_calendar::{types, AsCalendar, Calendar, Date};
2424

2525
fn bench_date<A: AsCalendar>(date: &mut Date<A>) {
2626
// black_box used to avoid compiler optimization.
2727
// Arithmetic
28-
date.add(DateDuration {
29-
is_negative: false,
30-
years: black_box(1),
31-
months: black_box(2),
32-
weeks: black_box(3),
33-
days: black_box(4),
34-
});
28+
date.add_with_options(
29+
types::DateDuration {
30+
is_negative: false,
31+
years: black_box(1),
32+
months: black_box(2),
33+
weeks: black_box(3),
34+
days: black_box(4),
35+
},
36+
Default::default(),
37+
)
38+
.unwrap();
3539

3640
// Retrieving vals
3741
let _ = black_box(date.year());

components/calendar/src/any_calendar.rs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
77
use crate::cal::iso::IsoDateInner;
88
use crate::cal::*;
9-
use crate::duration::{DateAddOptions, DateUntilOptions};
109
use crate::error::DateError;
1110
use crate::options::DateFromFieldsOptions;
11+
use crate::options::{DateAddOptions, DateUntilOptions};
1212
use crate::types::{DateFields, YearInfo};
13-
use crate::{types, AsCalendar, Calendar, Date, DateDuration, Ref};
13+
use crate::{types, AsCalendar, Calendar, Date, Ref};
1414

1515
use crate::preferences::{CalendarAlgorithm, HijriCalendarAlgorithm};
1616
use icu_locale_core::preferences::define_preferences;
@@ -244,8 +244,36 @@ macro_rules! match_cal {
244244
};
245245
}
246246

247+
/// Error returned when comparing two [`Date`]s with [`AnyCalendar`].
248+
#[derive(Debug, Copy, Clone)]
247249
#[non_exhaustive]
248250
pub enum AnyCalendarUntilError {
251+
/// The calendars of the two dates being compared are not equal.
252+
///
253+
/// To compare dates in different calendars, convert them to the same calendar first.
254+
///
255+
/// # Examples
256+
///
257+
/// ```
258+
/// use icu::calendar::Date;
259+
/// use icu::calendar::cal::AnyCalendarUntilError;
260+
///
261+
/// let d1 = Date::try_new_gregorian(2000, 1, 1).unwrap().to_any();
262+
/// let d2 = Date::try_new_hebrew(5780, 1, 1).unwrap().to_any();
263+
///
264+
/// assert!(matches!(
265+
/// d1.until(&d2, Default::default()),
266+
/// Err(AnyCalendarUntilError::MismatchedCalendars),
267+
/// ));
268+
///
269+
/// // To compare the dates, convert them to the same calendar,
270+
/// // such as ISO.
271+
///
272+
/// assert!(matches!(
273+
/// d1.to_iso().until(&d2.to_iso(), Default::default()),
274+
/// Ok(_)
275+
/// ));
276+
/// ```
249277
MismatchedCalendars,
250278
}
251279

@@ -294,7 +322,7 @@ impl Calendar for AnyCalendar {
294322
fn add(
295323
&self,
296324
date: &Self::DateInner,
297-
duration: DateDuration,
325+
duration: types::DateDuration,
298326
options: DateAddOptions,
299327
) -> Result<Self::DateInner, DateError> {
300328
Ok(match_cal_and_date!(match (self, date): (c, d) wrap => c.add(d, duration, options)?))
@@ -304,12 +332,12 @@ impl Calendar for AnyCalendar {
304332
&self,
305333
date1: &Self::DateInner,
306334
date2: &Self::DateInner,
307-
options: DateUntilOptions
308-
) -> Result<DateDuration, Self::UntilError> {
335+
options: DateUntilOptions,
336+
) -> Result<types::DateDuration, Self::UntilError> {
309337
let result = match_cal_and_date_date!(match (self, date1, date2): (c, d1, d2) => c.until(d1, d2, options)).0;
310338
// map from Result<DateDuration, Infallible> to Result<DateDuration, Self::UntilError>
311339
match result {
312-
Ok(duration) => Ok(duration)
340+
Ok(duration) => Ok(duration),
313341
}
314342
}
315343

components/calendar/src/cal/abstract_gregorian.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ use crate::cal::iso::{IsoDateInner, IsoEra};
66
use crate::calendar_arithmetic::{
77
ArithmeticDate, ArithmeticDateBuilder, CalendarArithmetic, DateFieldsResolver,
88
};
9-
use crate::duration::{DateAddOptions, DateUntilOptions};
109
use crate::error::DateError;
1110
use crate::options::DateFromFieldsOptions;
11+
use crate::options::{DateAddOptions, DateUntilOptions};
1212
use crate::preferences::CalendarAlgorithm;
1313
use crate::types::EraYear;
14-
use crate::{types, Calendar, DateDuration, RangeError};
14+
use crate::{types, Calendar, RangeError};
1515
use calendrical_calculations::helpers::I32CastError;
1616
use calendrical_calculations::rata_die::RataDie;
1717

@@ -155,7 +155,12 @@ impl<Y: GregorianYears> Calendar for AbstractGregorian<Y> {
155155
date.days_in_month()
156156
}
157157

158-
fn add(&self, date: &Self::DateInner, duration: DateDuration, options: DateAddOptions) -> Result<Self::DateInner, DateError> {
158+
fn add(
159+
&self,
160+
date: &Self::DateInner,
161+
duration: types::DateDuration,
162+
options: DateAddOptions,
163+
) -> Result<Self::DateInner, DateError> {
159164
date.added(duration, &AbstractGregorian(IsoEra), options)
160165
}
161166

@@ -164,7 +169,7 @@ impl<Y: GregorianYears> Calendar for AbstractGregorian<Y> {
164169
date1: &Self::DateInner,
165170
date2: &Self::DateInner,
166171
options: DateUntilOptions,
167-
) -> Result<DateDuration, Self::UntilError> {
172+
) -> Result<types::DateDuration, Self::UntilError> {
168173
Ok(date1.until(date2, &AbstractGregorian(IsoEra), options))
169174
}
170175

@@ -263,19 +268,27 @@ macro_rules! impl_with_abstract_gregorian {
263268
crate::cal::abstract_gregorian::AbstractGregorian($eras_expr).days_in_month(&date.0)
264269
}
265270

266-
fn add(&self, date: &Self::DateInner, duration: crate::duration::DateDuration, options: crate::duration::DateAddOptions) -> Result<Self::DateInner, DateError> {
271+
fn add(
272+
&self,
273+
date: &Self::DateInner,
274+
duration: crate::types::DateDuration,
275+
options: crate::options::DateAddOptions,
276+
) -> Result<Self::DateInner, DateError> {
267277
let $self_ident = self;
268-
crate::cal::abstract_gregorian::AbstractGregorian($eras_expr).add(&date.0, duration, options).map($inner_date_ty)
278+
crate::cal::abstract_gregorian::AbstractGregorian($eras_expr)
279+
.add(&date.0, duration, options)
280+
.map($inner_date_ty)
269281
}
270282

271283
fn until(
272284
&self,
273285
date1: &Self::DateInner,
274286
date2: &Self::DateInner,
275-
options: crate::duration::DateUntilOptions,
276-
) -> Result<crate::duration::DateDuration, Self::UntilError> {
287+
options: crate::options::DateUntilOptions,
288+
) -> Result<crate::types::DateDuration, Self::UntilError> {
277289
let $self_ident = self;
278-
crate::cal::abstract_gregorian::AbstractGregorian($eras_expr).until(&date1.0, &date2.0, options)
290+
crate::cal::abstract_gregorian::AbstractGregorian($eras_expr)
291+
.until(&date1.0, &date2.0, options)
279292
}
280293

281294
fn year_info(&self, date: &Self::DateInner) -> Self::Year {

components/calendar/src/cal/chinese.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ use crate::calendar_arithmetic::{
77
ArithmeticDate, ArithmeticDateBuilder, CalendarArithmetic, ToExtendedYear,
88
};
99
use crate::calendar_arithmetic::{DateFieldsResolver, PrecomputedDataSource};
10-
use crate::duration::{DateAddOptions, DateUntilOptions};
1110
use crate::error::DateError;
11+
use crate::options::{DateAddOptions, DateUntilOptions};
1212
use crate::options::{DateFromFieldsOptions, Overflow};
1313
use crate::provider::chinese_based::{ChineseBasedCache, PackedChineseBasedYearInfo};
1414
use crate::types::{MonthCode, MonthInfo};
1515
use crate::AsCalendar;
16-
use crate::{types, Calendar, Date, DateDuration};
16+
use crate::{types, Calendar, Date};
1717
use calendrical_calculations::chinese_based::{
1818
self, ChineseBased, YearBounds, WELL_BEHAVED_ASTRONOMICAL_RANGE,
1919
};
@@ -635,7 +635,12 @@ impl<X: Rules> Calendar for LunarChinese<X> {
635635
date.0.days_in_month()
636636
}
637637

638-
fn add(&self, date: &Self::DateInner, duration: DateDuration, options: DateAddOptions) -> Result<Self::DateInner, DateError> {
638+
fn add(
639+
&self,
640+
date: &Self::DateInner,
641+
duration: types::DateDuration,
642+
options: DateAddOptions,
643+
) -> Result<Self::DateInner, DateError> {
639644
date.0.added(duration, self, options).map(ChineseDateInner)
640645
}
641646

@@ -644,7 +649,7 @@ impl<X: Rules> Calendar for LunarChinese<X> {
644649
date1: &Self::DateInner,
645650
date2: &Self::DateInner,
646651
options: DateUntilOptions,
647-
) -> Result<DateDuration, Self::UntilError> {
652+
) -> Result<types::DateDuration, Self::UntilError> {
648653
Ok(date1.0.until(&date2.0, self, options))
649654
}
650655

components/calendar/src/cal/coptic.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
use crate::cal::iso::{Iso, IsoDateInner};
66
use crate::calendar_arithmetic::{ArithmeticDate, CalendarArithmetic};
77
use crate::calendar_arithmetic::{ArithmeticDateBuilder, DateFieldsResolver};
8-
use crate::duration::{DateAddOptions, DateUntilOptions};
98
use crate::error::DateError;
109
use crate::options::DateFromFieldsOptions;
11-
use crate::{types, Calendar, Date, DateDuration, RangeError};
10+
use crate::options::{DateAddOptions, DateUntilOptions};
11+
use crate::{types, Calendar, Date, RangeError};
1212
use calendrical_calculations::helpers::I32CastError;
1313
use calendrical_calculations::rata_die::RataDie;
1414
use tinystr::tinystr;
@@ -179,7 +179,12 @@ impl Calendar for Coptic {
179179
date.0.days_in_month()
180180
}
181181

182-
fn add(&self, date: &Self::DateInner, duration: DateDuration, options: DateAddOptions) -> Result<Self::DateInner, DateError> {
182+
fn add(
183+
&self,
184+
date: &Self::DateInner,
185+
duration: types::DateDuration,
186+
options: DateAddOptions,
187+
) -> Result<Self::DateInner, DateError> {
183188
date.0.added(duration, self, options).map(CopticDateInner)
184189
}
185190

@@ -188,7 +193,7 @@ impl Calendar for Coptic {
188193
date1: &Self::DateInner,
189194
date2: &Self::DateInner,
190195
options: DateUntilOptions,
191-
) -> Result<DateDuration, Self::UntilError> {
196+
) -> Result<types::DateDuration, Self::UntilError> {
192197
Ok(date1.0.until(&date2.0, self, options))
193198
}
194199

components/calendar/src/cal/ethiopian.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ use crate::cal::coptic::CopticDateInner;
66
use crate::cal::iso::IsoDateInner;
77
use crate::cal::Coptic;
88
use crate::calendar_arithmetic::{ArithmeticDate, ArithmeticDateBuilder, DateFieldsResolver};
9-
use crate::duration::{DateAddOptions, DateUntilOptions};
109
use crate::error::DateError;
1110
use crate::options::DateFromFieldsOptions;
11+
use crate::options::{DateAddOptions, DateUntilOptions};
1212
use crate::types::DateFields;
13-
use crate::{types, Calendar, Date, DateDuration, RangeError};
13+
use crate::{types, Calendar, Date, RangeError};
1414
use calendrical_calculations::rata_die::RataDie;
1515
use tinystr::tinystr;
1616

@@ -146,16 +146,23 @@ impl Calendar for Ethiopian {
146146
Coptic.days_in_month(&date.0)
147147
}
148148

149-
fn add(&self, date: &Self::DateInner, duration: DateDuration, options: DateAddOptions) -> Result<Self::DateInner, DateError> {
150-
Coptic.add(&date.0, duration, options).map(EthiopianDateInner)
149+
fn add(
150+
&self,
151+
date: &Self::DateInner,
152+
duration: types::DateDuration,
153+
options: DateAddOptions,
154+
) -> Result<Self::DateInner, DateError> {
155+
Coptic
156+
.add(&date.0, duration, options)
157+
.map(EthiopianDateInner)
151158
}
152159

153160
fn until(
154161
&self,
155162
date1: &Self::DateInner,
156163
date2: &Self::DateInner,
157164
options: DateUntilOptions,
158-
) -> Result<DateDuration, Self::UntilError> {
165+
) -> Result<types::DateDuration, Self::UntilError> {
159166
Coptic.until(&date1.0, &date2.0, options)
160167
}
161168

components/calendar/src/cal/hebrew.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ use crate::calendar_arithmetic::{
77
ArithmeticDate, CalendarArithmetic, DateFieldsResolver, ToExtendedYear,
88
};
99
use crate::calendar_arithmetic::{ArithmeticDateBuilder, PrecomputedDataSource};
10-
use crate::duration::{DateAddOptions, DateUntilOptions};
1110
use crate::error::DateError;
11+
use crate::options::{DateAddOptions, DateUntilOptions};
1212
use crate::options::{DateFromFieldsOptions, Overflow};
1313
use crate::types::{DateFields, MonthInfo};
1414
use crate::RangeError;
15-
use crate::{types, Calendar, Date, DateDuration};
15+
use crate::{types, Calendar, Date};
1616
use ::tinystr::tinystr;
1717
use calendrical_calculations::hebrew_keviyah::{Keviyah, YearInfo};
1818
use calendrical_calculations::rata_die::RataDie;
@@ -339,7 +339,12 @@ impl Calendar for Hebrew {
339339
date.0.days_in_month()
340340
}
341341

342-
fn add(&self, date: &Self::DateInner, duration: DateDuration, options: DateAddOptions) -> Result<Self::DateInner, DateError> {
342+
fn add(
343+
&self,
344+
date: &Self::DateInner,
345+
duration: types::DateDuration,
346+
options: DateAddOptions,
347+
) -> Result<Self::DateInner, DateError> {
343348
date.0.added(duration, self, options).map(HebrewDateInner)
344349
}
345350

@@ -348,7 +353,7 @@ impl Calendar for Hebrew {
348353
date1: &Self::DateInner,
349354
date2: &Self::DateInner,
350355
options: DateUntilOptions,
351-
) -> Result<DateDuration, Self::UntilError> {
356+
) -> Result<types::DateDuration, Self::UntilError> {
352357
Ok(date1.0.until(&date2.0, self, options))
353358
}
354359

components/calendar/src/cal/hijri.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ use crate::cal::iso::{Iso, IsoDateInner};
66
use crate::calendar_arithmetic::{ArithmeticDate, CalendarArithmetic};
77
use crate::calendar_arithmetic::{ArithmeticDateBuilder, DateFieldsResolver};
88
use crate::calendar_arithmetic::{PrecomputedDataSource, ToExtendedYear};
9-
use crate::duration::{DateAddOptions, DateUntilOptions};
109
use crate::error::DateError;
1110
use crate::options::DateFromFieldsOptions;
11+
use crate::options::{DateAddOptions, DateUntilOptions};
1212
use crate::provider::hijri::PackedHijriYearInfo;
1313
use crate::types::DateFields;
14-
use crate::{types, Calendar, Date, DateDuration};
14+
use crate::{types, Calendar, Date};
1515
use crate::{AsCalendar, RangeError};
1616
use calendrical_calculations::islamic::{
1717
ISLAMIC_EPOCH_FRIDAY, ISLAMIC_EPOCH_THURSDAY, WELL_BEHAVED_ASTRONOMICAL_RANGE,
@@ -665,7 +665,12 @@ impl<R: Rules> Calendar for Hijri<R> {
665665
date.0.days_in_month()
666666
}
667667

668-
fn add(&self, date: &Self::DateInner, duration: DateDuration, options: DateAddOptions) -> Result<Self::DateInner, DateError> {
668+
fn add(
669+
&self,
670+
date: &Self::DateInner,
671+
duration: types::DateDuration,
672+
options: DateAddOptions,
673+
) -> Result<Self::DateInner, DateError> {
669674
date.0.added(duration, self, options).map(HijriDateInner)
670675
}
671676

@@ -674,7 +679,7 @@ impl<R: Rules> Calendar for Hijri<R> {
674679
date1: &Self::DateInner,
675680
date2: &Self::DateInner,
676681
options: DateUntilOptions,
677-
) -> Result<DateDuration, Self::UntilError> {
682+
) -> Result<types::DateDuration, Self::UntilError> {
678683
Ok(date1.0.until(&date2.0, self, options))
679684
}
680685

0 commit comments

Comments
 (0)