// rustfmt-wrap_comments: true
// Enums test

#[atrr]
pub enum Test {
    A,
    B(u32, A /* comment */, SomeType),
    /// Doc comment
    C,
}

pub enum Foo<'a, Y: Baz>
where
    X: Whatever,
{
    A,
}

enum EmptyWithComment {
    // Some comment
}

// C-style enum
enum Bar {
    A = 1,
    #[someAttr(test)]
    B = 2, // comment
    C,
}

enum LongVariants {
    First(
        LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONG, // comment
        VARIANT,
    ),
    // This is the second variant
    Second,
}

enum StructLikeVariants {
    Normal(u32, String),
    StructLike {
        x: i32, // Test comment
        // Pre-comment
        #[Attr50]
        y: SomeType, // Another Comment
    },
    SL {
        a: A,
    },
}

enum X {
    CreateWebGLPaintTask(
        Size2D<i32>,
        GLContextAttributes,
        IpcSender<Result<(IpcSender<CanvasMsg>, usize), String>>,
    ), // This is a post comment
}

pub enum EnumWithAttributes {
    //This is a pre comment
    // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    TupleVar(usize, usize, usize), /* AAAA AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA
                                    * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA */
    // Pre Comment
    #[rustfmt::skip]
    SkippedItem(String,String,), // Post-comment
    #[another_attr]
    #[attr2]
    ItemStruct {
        x: usize,
        y: usize,
    }, /* Comment AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA */
    // And another
    ForcedPreflight, /* AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
                      * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA */
}

pub enum SingleTuple {
    // Pre Comment AAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    Match(usize, usize, String), /* Post-comment AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA */
}

pub enum SingleStruct {
    Match { name: String, loc: usize }, // Post-comment
}

pub enum GenericEnum<I, T>
where
    I: Iterator<Item = T>,
{
    // Pre Comment
    Left { list: I, root: T },  // Post-comment
    Right { list: I, root: T }, // Post Comment
}

enum EmptyWithComment {
    // Some comment
}

enum TestFormatFails {
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,
}

fn nested_enum_test() {
    if true {
        enum TestEnum {
            One(
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
                usize,
            ), /* AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA
                * AAAAAAAAAAAAAAAAAAAAAA */
            Two, /* AAAAAAAAAAAAAAAAAA  AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
                  * AAAAAAAAAAAAAAAAAA */
        }
        enum TestNestedFormatFail {
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,
        }
    }
}

pub struct EmptyWithComment {
    // FIXME: Implement this struct
}

// #1115
pub enum Bencoding<'i> {
    Str(&'i [u8]),
    Int(i64),
    List(Vec<Bencoding<'i>>),
    /// A bencoded dict value. The first element the slice of bytes in the
    /// source that the dict is composed of. The second is the dict, decoded
    /// into an ordered map.
    // TODO make Dict "structlike" AKA name the two values.
    Dict(&'i [u8], BTreeMap<&'i [u8], Bencoding<'i>>),
}

// #1261
pub enum CoreResourceMsg {
    SetCookieForUrl(
        ServoUrl,
        #[serde(
            deserialize_with = "::hyper_serde::deserialize",
            serialize_with = "::hyper_serde::serialize"
        )]
        Cookie,
        CookieSource,
    ),
}

enum Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
{}
enum Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
{}
enum Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
{}
enum Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
{
    Foo,
}

// #1046
pub enum Entry<'a, K: 'a, V: 'a> {
    Vacant(#[stable(feature = "rust1", since = "1.0.0")] VacantEntry<'a, K, V>),
    Occupied(#[stable(feature = "rust1", since = "1.0.0")] OccupiedEntry<'a, K, V>),
}

// #2081
pub enum ForegroundColor {
    CYAN =
        (winapi::FOREGROUND_INTENSITY | winapi::FOREGROUND_GREEN | winapi::FOREGROUND_BLUE) as u16,
}

// #2098
pub enum E<'a> {
    V(<std::slice::Iter<'a, Xxxxxxxxxxxxxx> as Iterator>::Item),
}

// #1809
enum State {
    TryRecv {
        pos: usize,
        lap: u8,
        closed_count: usize,
    },
    Subscribe {
        pos: usize,
    },
    IsReady {
        pos: usize,
        ready: bool,
    },
    Unsubscribe {
        pos: usize,
        lap: u8,
        id_woken: usize,
    },
    FinalTryRecv {
        pos: usize,
        id_woken: usize,
    },
    TimedOut,
    Disconnected,
}

// #2190
#[derive(Debug, Fail)]
enum AnError {
    #[fail(
        display = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    )]
    UnexpectedSingleToken { token: syn::Token },
}

// #2193
enum WidthOf101 {
    #[fail(display = ".....................................................")]
    Io(::std::io::Error),
    #[fail(display = ".....................................................")]
    Ioo(::std::io::Error),
    Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(::std::io::Error),
    Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(
        ::std::io::Error,
    ),
}

// #2389
pub enum QlError {
    #[fail(display = "Parsing error: {}", 0)]
    LexError(parser::lexer::LexError),
    #[fail(display = "Parsing error: {:?}", 0)]
    ParseError(parser::ParseError),
    #[fail(display = "Validation error: {:?}", 0)]
    ValidationError(Vec<validation::Error>),
    #[fail(display = "Execution error: {}", 0)]
    ExecutionError(String),
    // (from, to)
    #[fail(display = "Translation error: from {} to {}", 0, 1)]
    TranslationError(String, String),
    // (kind, input, expected)
    #[fail(
        display = "aaaaaaaaaaaaCould not find {}: Found: {}, expected: {:?}",
        0, 1, 2
    )]
    ResolveError(&'static str, String, Option<String>),
}

// #2594
enum Foo {}
enum Bar {}

// #3562
enum PublishedFileVisibility {
    Public =
        sys::ERemoteStoragePublishedFileVisibility_k_ERemoteStoragePublishedFileVisibilityPublic,
    FriendsOnly = sys::ERemoteStoragePublishedFileVisibility_k_ERemoteStoragePublishedFileVisibilityFriendsOnly,
    Private =
        sys::ERemoteStoragePublishedFileVisibility_k_ERemoteStoragePublishedFileVisibilityPrivate,
}

// #3771
//#![feature(arbitrary_enum_discriminant)]
#[repr(u32)]
pub enum E {
    A {
        a: u32,
    } = 0x100,
    B {
        field1: u32,
        field2: u8,
        field3: m::M,
    } = 0x300, // comment
}
