1 // Copyright 2018 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 use quote::quote;
6 use syn::{parse_quote, DeriveInput};
7 
8 #[test]
test_variant_bits()9 fn test_variant_bits() {
10     let mut variants = vec![parse_quote!(A)];
11     assert_eq!(crate::variant_bits(&variants), 0);
12 
13     variants.push(parse_quote!(B));
14     variants.push(parse_quote!(C));
15     assert_eq!(crate::variant_bits(&variants), 2);
16 
17     for _ in 0..1021 {
18         variants.push(parse_quote!(Dynamic));
19     }
20     assert_eq!(crate::variant_bits(&variants), 10);
21 
22     variants.push(parse_quote!(OneMore));
23     assert_eq!(crate::variant_bits(&variants), 11);
24 }
25 
26 #[test]
poll_token_e2e()27 fn poll_token_e2e() {
28     let input: DeriveInput = parse_quote! {
29         enum Token {
30             A,
31             B,
32             C,
33             D(usize),
34             E { foobaz: u32 },
35         }
36     };
37 
38     let actual = crate::poll_token_inner(input);
39     let expected = quote! {
40         impl PollToken for Token {
41             fn as_raw_token(&self) -> u64 {
42                 match *self {
43                     Token::A => 0u64,
44                     Token::B => 1u64,
45                     Token::C => 2u64,
46                     Token::D { 0: data } => 3u64 | ((data as u64) << 3u32),
47                     Token::E { foobaz: data } => 4u64 | ((data as u64) << 3u32),
48                 }
49             }
50 
51             fn from_raw_token(data: u64) -> Self {
52                 match data & 7u64 {
53                     0u64 => Token::A,
54                     1u64 => Token::B,
55                     2u64 => Token::C,
56                     3u64 => Token::D { 0: (data >> 3u32) as usize },
57                     4u64 => Token::E { foobaz: (data >> 3u32) as u32 },
58                     _ => unreachable!(),
59                 }
60             }
61         }
62     };
63 
64     assert_eq!(actual.to_string(), expected.to_string());
65 }
66