// Copyright 2018 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. use quote::quote; use syn::{parse_quote, DeriveInput}; #[test] fn test_repr() { let input: DeriveInput = parse_quote! { #[repr(u8)] enum E { A, B, C, } }; let actual = crate::testable_derive(input); let expected = quote! { #[allow(non_upper_case_globals)] impl E { pub fn n(value: u8) -> Option { struct discriminant; impl discriminant { const A: u8 = E::A as u8; const B: u8 = E::B as u8; const C: u8 = E::C as u8; } match value { discriminant::A => Some(E::A), discriminant::B => Some(E::B), discriminant::C => Some(E::C), _ => None, } } } }; assert_eq!(actual.to_string(), expected.to_string()); } #[test] fn test_no_repr() { let input: DeriveInput = parse_quote! { enum E { A, B, C, } }; let actual = crate::testable_derive(input); let expected = quote! { #[allow(non_upper_case_globals)] impl E { pub fn n>(value: REPR) -> Option { struct discriminant; impl discriminant { const A: i64 = E::A as i64; const B: i64 = E::B as i64; const C: i64 = E::C as i64; } match >::into(value) { discriminant::A => Some(E::A), discriminant::B => Some(E::B), discriminant::C => Some(E::C), _ => None, } } } }; assert_eq!(actual.to_string(), expected.to_string()); }