cgp-tests 0.6.1

Context-generic programming meta crate
Documentation
use core::fmt::Display;

use cgp::prelude::*;

#[test]
fn test_single_named_field() {
    #[derive(Clone, Debug, Eq, PartialEq, HasFields)]
    pub struct Person {
        pub name: String,
    }

    let name = "Alice".to_owned();

    let person1 = Person { name: name.clone() };

    let product = person1.clone().to_fields();
    assert_eq!(product, Cons(name.clone().into(), Nil));

    let product_ref = person1.to_fields_ref();
    assert_eq!(product_ref, Cons((&name).into(), Nil));

    let person2 = Person::from_fields(product);

    assert_eq!(person1, person2);
}

#[test]
fn test_two_named_field() {
    #[derive(Clone, Debug, Eq, PartialEq, HasFields)]
    pub struct Person {
        pub name: String,
        pub age: u8,
    }

    let name = "Alice".to_owned();

    let person1 = Person {
        name: name.clone(),
        age: 32,
    };

    let product = person1.clone().to_fields();
    assert_eq!(product, Cons(name.clone().into(), Cons(32.into(), Nil)));

    let product_ref = person1.to_fields_ref();
    assert_eq!(product_ref, Cons((&name).into(), Cons((&32).into(), Nil)));

    let person2 = Person::from_fields(product);

    assert_eq!(person1, person2);
}

#[test]
fn test_generic_struct() {
    #[derive(Clone, Debug, Eq, PartialEq, HasFields)]
    pub struct Person<Name>
    where
        Name: Display,
    {
        pub name: Name,
        pub age: u8,
    }

    let name = "Alice".to_owned();

    let person1 = Person {
        name: name.clone(),
        age: 32,
    };

    let product = person1.clone().to_fields();
    assert_eq!(product, Cons(name.clone().into(), Cons(32.into(), Nil)));

    let product_ref = person1.to_fields_ref();
    assert_eq!(product_ref, Cons((&name).into(), Cons((&32).into(), Nil)));

    let person2 = Person::from_fields(product);

    assert_eq!(person1, person2);
}

#[test]
fn test_generic_lifetime_struct() {
    #[derive(Clone, Debug, Eq, PartialEq, HasFields)]
    pub struct Person<'a, Name>
    where
        Name: Display,
    {
        pub name: &'a Name,
        pub age: &'a u8,
    }

    let name = "Alice".to_owned();

    let person1 = Person {
        name: &name,
        age: &32,
    };

    let product = person1.clone().to_fields();
    assert_eq!(product, Cons((&name).into(), Cons((&32).into(), Nil)));

    let product_ref = person1.to_fields_ref();
    assert_eq!(product_ref, Cons((&&name).into(), Cons((&&32).into(), Nil)));

    let person2 = Person::from_fields(product);

    assert_eq!(person1, person2);
}

#[test]
fn test_single_unnamed_field() {
    #[derive(Clone, Debug, Eq, PartialEq, HasFields)]
    pub struct Person(String);

    let name = "Alice".to_owned();

    let person1 = Person(name.clone());

    let product = person1.clone().to_fields();
    assert_eq!(product, name.clone());

    let product_ref = person1.to_fields_ref();
    assert_eq!(product_ref, &name);

    let person2 = Person::from_fields(product);

    assert_eq!(person1, person2);
}

#[test]
fn test_single_unnamed_multi_field() {
    #[derive(Clone, Debug, Eq, PartialEq, HasFields)]
    pub struct Person(String, u8);

    let name = "Alice".to_owned();

    let person1 = Person(name.clone(), 32);

    let product = person1.clone().to_fields();
    assert_eq!(product, Cons(name.clone().into(), Cons(32.into(), Nil)));

    let product_ref = person1.to_fields_ref();
    assert_eq!(product_ref, Cons((&name).into(), Cons((&32).into(), Nil)));

    let person2 = Person::from_fields(product);

    assert_eq!(person1, person2);
}