Revision control
Copy as Markdown
Other Tools
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
use crate::data_struct_impl;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
fn check(attr: TokenStream2, item: TokenStream2, expected: TokenStream2) {
let actual = data_struct_impl(syn::parse2(attr).unwrap(), syn::parse2(item).unwrap());
assert_eq!(expected.to_string(), actual.to_string());
}
#[test]
#[rustfmt::skip] // inserts a comma
fn test_basic() {
// #[data_struct]
check(
quote!(),
quote!(
pub struct FooV1;
),
quote!(
#[derive(icu_provider::prelude::yoke::Yokeable, icu_provider::prelude::zerofrom::ZeroFrom)]
pub struct FooV1;
),
);
}
#[test]
fn test_data_marker() {
// #[data_struct(FooV1Marker)]
check(
quote!(FooV1Marker),
quote!(
pub struct FooV1;
),
quote!(
#[doc = "Marker type for [`FooV1`]"]
pub struct FooV1Marker;
impl icu_provider::DataMarker for FooV1Marker {
type Yokeable = FooV1;
}
#[derive(icu_provider::prelude::yoke::Yokeable, icu_provider::prelude::zerofrom::ZeroFrom)]
pub struct FooV1;
),
);
}
#[test]
fn test_keyed_data_marker() {
// #[data_struct(BarV1Marker = "demo/bar@1")]
check(
quote!(BarV1Marker = "demo/bar@1"),
quote!(
pub struct FooV1;
),
quote!(
#[doc = "Marker type for [`FooV1`]: \"demo/bar@1\"\n\n- Fallback priority: language (default)\n- Extension keyword: none (default)"]
pub struct BarV1Marker;
impl icu_provider::DataMarker for BarV1Marker {
type Yokeable = FooV1;
}
impl icu_provider::KeyedDataMarker for BarV1Marker {
const KEY: icu_provider::DataKey = icu_provider::data_key!(
"demo/bar@1",
icu_provider::DataKeyMetadata::construct_internal(
icu_provider::_internal::LocaleFallbackPriority::const_default(),
None,
None,
false,
));
}
#[derive(icu_provider::prelude::yoke::Yokeable, icu_provider::prelude::zerofrom::ZeroFrom)]
pub struct FooV1;
),
);
}
#[test]
fn test_multi_named_keyed_data_marker() {
// #[data_struct(FooV1Marker, BarV1Marker = "demo/bar@1", BazV1Marker = "demo/baz@1")]
check(
quote![
FooV1Marker,
BarV1Marker = "demo/bar@1",
BazV1Marker = "demo/baz@1",
],
quote!(
pub struct FooV1<'data>;
),
quote!(
#[doc = "Marker type for [`FooV1`]"]
pub struct FooV1Marker;
impl icu_provider::DataMarker for FooV1Marker {
type Yokeable = FooV1<'static>;
}
#[doc = "Marker type for [`FooV1`]: \"demo/bar@1\"\n\n- Fallback priority: language (default)\n- Extension keyword: none (default)"]
pub struct BarV1Marker;
impl icu_provider::DataMarker for BarV1Marker {
type Yokeable = FooV1<'static>;
}
impl icu_provider::KeyedDataMarker for BarV1Marker {
const KEY: icu_provider::DataKey = icu_provider::data_key!(
"demo/bar@1",
icu_provider::DataKeyMetadata::construct_internal(
icu_provider::_internal::LocaleFallbackPriority::const_default(),
None,
None,
false,
));
}
#[doc = "Marker type for [`FooV1`]: \"demo/baz@1\"\n\n- Fallback priority: language (default)\n- Extension keyword: none (default)"]
pub struct BazV1Marker;
impl icu_provider::DataMarker for BazV1Marker {
type Yokeable = FooV1<'static>;
}
impl icu_provider::KeyedDataMarker for BazV1Marker {
const KEY: icu_provider::DataKey = icu_provider::data_key!(
"demo/baz@1",
icu_provider::DataKeyMetadata::construct_internal(
icu_provider::_internal::LocaleFallbackPriority::const_default(),
None,
None,
false,
));
}
#[derive(icu_provider::prelude::yoke::Yokeable, icu_provider::prelude::zerofrom::ZeroFrom)]
pub struct FooV1<'data>;
),
);
}
#[test]
fn test_databake() {
check(
quote!(BarV1Marker = "demo/bar@1"),
quote!(
#[databake(path = test::path)]
pub struct FooV1;
),
quote!(
#[doc = "Marker type for [`FooV1`]: \"demo/bar@1\"\n\n- Fallback priority: language (default)\n- Extension keyword: none (default)"]
#[derive(databake::Bake)]
#[databake(path = test::path)]
pub struct BarV1Marker;
impl icu_provider::DataMarker for BarV1Marker {
type Yokeable = FooV1;
}
impl icu_provider::KeyedDataMarker for BarV1Marker {
const KEY: icu_provider::DataKey = icu_provider::data_key!(
"demo/bar@1",
icu_provider::DataKeyMetadata::construct_internal(
icu_provider::_internal::LocaleFallbackPriority::const_default(),
None,
None,
false,
));
}
#[derive(icu_provider::prelude::yoke::Yokeable, icu_provider::prelude::zerofrom::ZeroFrom)]
#[databake(path = test::path)]
pub struct FooV1;
),
);
}
#[test]
fn test_attributes() {
// #[data_struct(FooV1Marker, marker(BarV1Marker, "demo/bar@1", fallback_by = "region", extension_kw = "ca"))]
check(
quote![
FooV1Marker,
marker(
BarV1Marker,
"demo/bar@1",
fallback_by = "region",
extension_key = "ca",
fallback_supplement = "collation",
singleton,
),
],
quote!(
pub struct FooV1<'data>;
),
quote!(
#[doc = "Marker type for [`FooV1`]"]
pub struct FooV1Marker;
impl icu_provider::DataMarker for FooV1Marker {
type Yokeable = FooV1<'static>;
}
#[doc = "Marker type for [`FooV1`]: \"demo/bar@1\"\n\n- Fallback priority: region\n- Extension keyword: ca"]
pub struct BarV1Marker;
impl icu_provider::DataMarker for BarV1Marker {
type Yokeable = FooV1<'static>;
}
impl icu_provider::KeyedDataMarker for BarV1Marker {
const KEY: icu_provider::DataKey = icu_provider::data_key!(
"demo/bar@1",
icu_provider::DataKeyMetadata::construct_internal(
icu_provider::_internal::LocaleFallbackPriority::Region,
Some(icu_provider::_internal::locid::extensions::unicode::key!("ca")),
Some(icu_provider::_internal::LocaleFallbackSupplement::Collation),
true,
));
}
#[derive(icu_provider::prelude::yoke::Yokeable, icu_provider::prelude::zerofrom::ZeroFrom)]
pub struct FooV1<'data>;
),
);
}