Files
fyroxengine--fyrox/fyrox-core-derive/tests/it/visit/basic.rs
T
2026-07-13 12:24:51 +08:00

197 lines
5.0 KiB
Rust

// Copyright (c) 2019-present Dmitry Stepanov and Fyrox Engine contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
#![allow(unused_imports)]
use std::{env, fs::File, io::Write, path::PathBuf};
use futures::executor::block_on;
use fyrox_core::visitor::prelude::*;
#[derive(Debug, Clone, Default, PartialEq, Visit)]
struct NamedFields {
a: f32,
snake_case: u32,
}
#[derive(Debug, Clone, Default, PartialEq, Visit)]
struct UnitStruct;
#[derive(Debug, Clone, Default, PartialEq, Visit)]
struct TupleStruct(f32, u32);
#[derive(Debug, Clone, Default, PartialEq, Visit)]
struct SkipAttr {
visited: f32,
#[visit(skip)]
skipped: u32,
}
#[derive(Debug, Clone, PartialEq, Visit)]
struct Generics<T: Visit + Default + 'static> {
items: Vec<T>,
}
// NOTE: This enum doesn't implement copy, but `#[derive(Visit)]` still works
#[derive(Debug, Clone, PartialEq, Eq, Hash, Visit, Default)]
enum PlainEnum {
#[default]
A,
B,
C,
}
#[derive(Debug, Clone, PartialEq, Visit)]
enum OneOfTheTypes {
NamedFields(NamedFields),
PlainEnum(PlainEnum),
U32(u32),
}
#[derive(Debug, Clone, PartialEq, Visit)]
enum ComplexEnum {
UnitVariant,
Tuple(i32, i32),
NamedFields { a: f32, b: u32 },
}
#[derive(Debug, Clone, PartialEq, Visit)]
enum GenericEnum<T>
where
T: std::fmt::Debug + Default + Visit + 'static,
{
UnitVariant,
Tuple(i32, Vec<T>),
}
#[test]
fn named_fields() {
let mut data = NamedFields {
a: 100.0,
snake_case: 200,
};
let mut data_default = NamedFields::default();
super::save_load("named_fields", &mut data, &mut data_default);
// The default data was overwritten with saved data.
// Now it should be same as the original data:
assert_eq!(data, data_default);
}
#[test]
fn unit_struct() {
let mut data = UnitStruct;
let mut data_default = UnitStruct;
// non seuse.. but anyways,
// `Visit` is implemented `UnitStruct;` as empty code block `{}`
super::save_load("unit_struct", &mut data, &mut data_default);
assert_eq!(data, data_default);
}
#[test]
fn tuple_struct() {
let mut data = TupleStruct(10.0, 20);
let mut data_default = TupleStruct(0.0, 0);
super::save_load("tuple_struct", &mut data, &mut data_default);
assert_eq!(data, data_default);
}
#[test]
fn skip_attr() {
let mut data = SkipAttr {
visited: 10.0,
skipped: 20,
};
let mut data_default = SkipAttr::default();
super::save_load("skip_attr", &mut data, &mut data_default);
// The default data was overwritten with saved data,
// except the `skipped` field:
assert_eq!(
data_default,
SkipAttr {
visited: data.visited,
skipped: Default::default(),
}
);
}
#[test]
fn generics() {
// But `Generics<T: Visit` is `Visit`
let mut data = Generics {
items: vec![100u32],
};
let mut data_default = Generics { items: vec![] };
super::save_load("generics", &mut data, &mut data_default);
assert_eq!(data, data_default);
}
#[test]
fn plain_enum() {
let mut data = PlainEnum::C;
let mut data_default = PlainEnum::A;
super::save_load("plain_enum", &mut data, &mut data_default);
assert_eq!(data, data_default);
}
#[test]
fn one_of_the_types() {
let mut data = OneOfTheTypes::NamedFields(NamedFields {
a: 1.0,
snake_case: 10,
});
let mut data_default = OneOfTheTypes::U32(0);
super::save_load("one_of_the_types", &mut data, &mut data_default);
assert_eq!(data, data_default);
}
#[test]
fn complex_enum() {
let mut data = ComplexEnum::Tuple(100, 200);
let mut data_default = ComplexEnum::UnitVariant;
super::save_load("complex_enum", &mut data, &mut data_default);
assert_eq!(data, data_default);
}
#[test]
fn generic_enum() {
let mut data = GenericEnum::Tuple(1, vec![100u32]);
let mut data_default = GenericEnum::UnitVariant;
super::save_load("generic_enum", &mut data, &mut data_default);
assert_eq!(data, data_default);
}