use crate::qjs;
#[derive(Clone, Copy, Eq, PartialEq, Hash, Debug)]
#[repr(u32)]
#[allow(clippy::unnecessary_cast)]
pub enum PredefinedAtom {
    Null = qjs::JS_ATOM_null as u32, False = qjs::JS_ATOM_false as u32,
    True = qjs::JS_ATOM_true as u32,
    If = qjs::JS_ATOM_if as u32,
    Else = qjs::JS_ATOM_else as u32,
    Return = qjs::JS_ATOM_return as u32,
    Var = qjs::JS_ATOM_var as u32,
    This = qjs::JS_ATOM_this as u32,
    Delete = qjs::JS_ATOM_delete as u32,
    Void = qjs::JS_ATOM_void as u32,
    Typeof = qjs::JS_ATOM_typeof as u32,
    New = qjs::JS_ATOM_new as u32,
    In = qjs::JS_ATOM_in as u32,
    Instanceof = qjs::JS_ATOM_instanceof as u32,
    Do = qjs::JS_ATOM_do as u32,
    While = qjs::JS_ATOM_while as u32,
    For = qjs::JS_ATOM_for as u32,
    Break = qjs::JS_ATOM_break as u32,
    Continue = qjs::JS_ATOM_continue as u32,
    Switch = qjs::JS_ATOM_switch as u32,
    Case = qjs::JS_ATOM_case as u32,
    Default = qjs::JS_ATOM_default as u32,
    Throw = qjs::JS_ATOM_throw as u32,
    Try = qjs::JS_ATOM_try as u32,
    Catch = qjs::JS_ATOM_catch as u32,
    Finally = qjs::JS_ATOM_finally as u32,
    FunctionKw = qjs::JS_ATOM_function as u32,
    Debugger = qjs::JS_ATOM_debugger as u32,
    With = qjs::JS_ATOM_with as u32,
    Class = qjs::JS_ATOM_class as u32,
    Const = qjs::JS_ATOM_const as u32,
    Enum = qjs::JS_ATOM_enum as u32,
    Export = qjs::JS_ATOM_export as u32,
    Extends = qjs::JS_ATOM_extends as u32,
    Import = qjs::JS_ATOM_import as u32,
    Super = qjs::JS_ATOM_super as u32,
    Implements = qjs::JS_ATOM_implements as u32,
    Interface = qjs::JS_ATOM_interface as u32,
    Let = qjs::JS_ATOM_let as u32,
    Package = qjs::JS_ATOM_package as u32,
    Private = qjs::JS_ATOM_private as u32,
    Protected = qjs::JS_ATOM_protected as u32,
    Public = qjs::JS_ATOM_public as u32,
    Static = qjs::JS_ATOM_static as u32,
    Yield = qjs::JS_ATOM_yield as u32,
    Await = qjs::JS_ATOM_await as u32,
    Empty = qjs::JS_ATOM_empty_string as u32,
    Length = qjs::JS_ATOM_length as u32,
    Message = qjs::JS_ATOM_message as u32,
    Errors = qjs::JS_ATOM_errors as u32,
    Stack = qjs::JS_ATOM_stack as u32,
    Name = qjs::JS_ATOM_name as u32,
    ToString = qjs::JS_ATOM_toString as u32,
    ToLocaleString = qjs::JS_ATOM_toLocaleString as u32,
    ValueOf = qjs::JS_ATOM_valueOf as u32,
    Eval = qjs::JS_ATOM_eval as u32,
    Prototype = qjs::JS_ATOM_prototype as u32,
    Constructor = qjs::JS_ATOM_constructor as u32,
    Configurable = qjs::JS_ATOM_configurable as u32,
    Writable = qjs::JS_ATOM_writable as u32,
    Enumerable = qjs::JS_ATOM_enumerable as u32,
    Value = qjs::JS_ATOM_value as u32,
    Getter = qjs::JS_ATOM_get as u32,
    Setter = qjs::JS_ATOM_set as u32,
    Of = qjs::JS_ATOM_of as u32,
    UnderscoreProto = qjs::JS_ATOM___proto__ as u32,
    Undefined = qjs::JS_ATOM_undefined as u32,
    NumberLower = qjs::JS_ATOM_number as u32,
    BooleanLower = qjs::JS_ATOM_boolean as u32,
    StringLower = qjs::JS_ATOM_string as u32,
    ObjectLower = qjs::JS_ATOM_object as u32,
    SymbolLower = qjs::JS_ATOM_symbol as u32,
    Integer = qjs::JS_ATOM_integer as u32,
    Unknown = qjs::JS_ATOM_unknown as u32,
    ArgumentsLower = qjs::JS_ATOM_arguments as u32,
    Callee = qjs::JS_ATOM_callee as u32,
    Caller = qjs::JS_ATOM_caller as u32,
    LastIndex = qjs::JS_ATOM_lastIndex as u32,
    Target = qjs::JS_ATOM_target as u32,
    Index = qjs::JS_ATOM_index as u32,
    Input = qjs::JS_ATOM_input as u32,
    DefineProperties = qjs::JS_ATOM_defineProperties as u32,
    Apply = qjs::JS_ATOM_apply as u32,
    Join = qjs::JS_ATOM_join as u32,
    Concat = qjs::JS_ATOM_concat as u32,
    Split = qjs::JS_ATOM_split as u32,
    Construct = qjs::JS_ATOM_construct as u32,
    GetPrototypeOf = qjs::JS_ATOM_getPrototypeOf as u32,
    SetPrototypeOf = qjs::JS_ATOM_setPrototypeOf as u32,
    IsExtensible = qjs::JS_ATOM_isExtensible as u32,
    PreventExtensions = qjs::JS_ATOM_preventExtensions as u32,
    Has = qjs::JS_ATOM_has as u32,
    DeleteProperty = qjs::JS_ATOM_deleteProperty as u32,
    DefineProperty = qjs::JS_ATOM_defineProperty as u32,
    GetOwnPropertyDescriptor = qjs::JS_ATOM_getOwnPropertyDescriptor as u32,
    OwnKeys = qjs::JS_ATOM_ownKeys as u32,
    Add = qjs::JS_ATOM_add as u32,
    Done = qjs::JS_ATOM_done as u32,
    Next = qjs::JS_ATOM_next as u32,
    Values = qjs::JS_ATOM_values as u32,
    Source = qjs::JS_ATOM_source as u32,
    Flags = qjs::JS_ATOM_flags as u32,
    Global = qjs::JS_ATOM_global as u32,
    Unicode = qjs::JS_ATOM_unicode as u32,
    Raw = qjs::JS_ATOM_raw as u32,
    NewTarget = qjs::JS_ATOM_new_target as u32,
    ThisActiveFunc = qjs::JS_ATOM_this_active_func as u32,
    HomeObject = qjs::JS_ATOM_home_object as u32,
    ComputedField = qjs::JS_ATOM_computed_field as u32,
    StaticComputedField = qjs::JS_ATOM_static_computed_field as u32, ClassFieldsInit = qjs::JS_ATOM_class_fields_init as u32,
    Brand = qjs::JS_ATOM_brand as u32,
    HashConstructor = qjs::JS_ATOM_hash_constructor as u32,
    As = qjs::JS_ATOM_as as u32,
    From = qjs::JS_ATOM_from as u32,
    Meta = qjs::JS_ATOM_meta as u32,
    StarDefault = qjs::JS_ATOM__default_ as u32,
    Star = qjs::JS_ATOM__star_ as u32,
    Module = qjs::JS_ATOM_Module as u32,
    Then = qjs::JS_ATOM_then as u32,
    Resolve = qjs::JS_ATOM_resolve as u32,
    Reject = qjs::JS_ATOM_reject as u32,
    PromiseLower = qjs::JS_ATOM_promise as u32,
    ProxyLower = qjs::JS_ATOM_proxy as u32,
    Revoke = qjs::JS_ATOM_revoke as u32,
    Async = qjs::JS_ATOM_async as u32,
    Exec = qjs::JS_ATOM_exec as u32,
    Groups = qjs::JS_ATOM_groups as u32,
    Status = qjs::JS_ATOM_status as u32,
    Reason = qjs::JS_ATOM_reason as u32,
    GlobalThis = qjs::JS_ATOM_globalThis as u32,
    Bigint = qjs::JS_ATOM_bigint as u32,
    ToJSON = qjs::JS_ATOM_toJSON as u32,
    MaxByteLength = qjs::JS_ATOM_maxByteLength as u32,
    Object = qjs::JS_ATOM_Object as u32,
    Array = qjs::JS_ATOM_Array as u32,
    Error = qjs::JS_ATOM_Error as u32,
    Number = qjs::JS_ATOM_Number as u32,
    String = qjs::JS_ATOM_String as u32,
    Boolean = qjs::JS_ATOM_Boolean as u32,
    Symbol = qjs::JS_ATOM_Symbol as u32,
    Arguments = qjs::JS_ATOM_Arguments as u32,
    Math = qjs::JS_ATOM_Math as u32,
    JSON = qjs::JS_ATOM_JSON as u32,
    Date = qjs::JS_ATOM_Date as u32,
    Function = qjs::JS_ATOM_Function as u32,
    GeneratorFunction = qjs::JS_ATOM_GeneratorFunction as u32,
    ForInIterator = qjs::JS_ATOM_ForInIterator as u32,
    RegExp = qjs::JS_ATOM_RegExp as u32,
    ArrayBuffer = qjs::JS_ATOM_ArrayBuffer as u32,
    SharedArrayBuffer = qjs::JS_ATOM_SharedArrayBuffer as u32,
    Uint8ClampedArray = qjs::JS_ATOM_Uint8ClampedArray as u32,
    Int8Array = qjs::JS_ATOM_Int8Array as u32,
    Uint8Array = qjs::JS_ATOM_Uint8Array as u32,
    Int16Array = qjs::JS_ATOM_Int16Array as u32,
    Uint16Array = qjs::JS_ATOM_Uint16Array as u32,
    Int32Array = qjs::JS_ATOM_Int32Array as u32,
    Uint32Array = qjs::JS_ATOM_Uint32Array as u32,
    BigInt64Array = qjs::JS_ATOM_BigInt64Array as u32,
    BigUint64Array = qjs::JS_ATOM_BigUint64Array as u32,
    Float32Array = qjs::JS_ATOM_Float32Array as u32,
    Float64Array = qjs::JS_ATOM_Float64Array as u32,
    DataView = qjs::JS_ATOM_DataView as u32,
    BigInt = qjs::JS_ATOM_BigInt as u32,
    Map = qjs::JS_ATOM_Map as u32,
    Set = qjs::JS_ATOM_Set as u32,
    WeakMap = qjs::JS_ATOM_WeakMap as u32,
    WeakSet = qjs::JS_ATOM_WeakSet as u32,
    MapIterator = qjs::JS_ATOM_Map_Iterator as u32,
    SetIterator = qjs::JS_ATOM_Set_Iterator as u32,
    ArrayIterator = qjs::JS_ATOM_Array_Iterator as u32,
    StringIterator = qjs::JS_ATOM_String_Iterator as u32,
    RegExpStringIterator = qjs::JS_ATOM_RegExp_String_Iterator as u32,
    Generator = qjs::JS_ATOM_Generator as u32,
    Proxy = qjs::JS_ATOM_Proxy as u32,
    Promise = qjs::JS_ATOM_Promise as u32,
    PromiseResolveFunction = qjs::JS_ATOM_PromiseResolveFunction as u32,
    PromiseRejectFunction = qjs::JS_ATOM_PromiseRejectFunction as u32,
    AsyncFunction = qjs::JS_ATOM_AsyncFunction as u32,
    AsyncFunctionResolve = qjs::JS_ATOM_AsyncFunctionResolve as u32,
    AsyncFunctionReject = qjs::JS_ATOM_AsyncFunctionReject as u32,
    AsyncGeneratorFunction = qjs::JS_ATOM_AsyncGeneratorFunction as u32,
    AsyncGenerator = qjs::JS_ATOM_AsyncGenerator as u32,
    EvalError = qjs::JS_ATOM_EvalError as u32,
    RangeError = qjs::JS_ATOM_RangeError as u32,
    ReferenceError = qjs::JS_ATOM_ReferenceError as u32,
    SyntaxError = qjs::JS_ATOM_SyntaxError as u32,
    TypeError = qjs::JS_ATOM_TypeError as u32,
    URIError = qjs::JS_ATOM_URIError as u32,
    InternalError = qjs::JS_ATOM_InternalError as u32,
    SymbolAsyncIterator = qjs::JS_ATOM_Symbol_asyncIterator as u32,
    SymbolIterator = qjs::JS_ATOM_Symbol_iterator as u32,
    SymbolMatch = qjs::JS_ATOM_Symbol_match as u32,
    SymbolMatchAll = qjs::JS_ATOM_Symbol_matchAll as u32,
    SymbolReplace = qjs::JS_ATOM_Symbol_replace as u32,
    SymbolSearch = qjs::JS_ATOM_Symbol_search as u32,
    SymbolSplit = qjs::JS_ATOM_Symbol_split as u32,
    SymbolToStringTag = qjs::JS_ATOM_Symbol_toStringTag as u32,
    SymbolIsConcatSpreadable = qjs::JS_ATOM_Symbol_isConcatSpreadable as u32,
    SymbolHasInstance = qjs::JS_ATOM_Symbol_hasInstance as u32,
    SymbolSpecies = qjs::JS_ATOM_Symbol_species as u32,
    SymbolUnscopables = qjs::JS_ATOM_Symbol_unscopables as u32,
}
impl PredefinedAtom {
    pub const fn is_symbol(self) -> bool {
        matches!(
            self,
            PredefinedAtom::SymbolAsyncIterator
                | PredefinedAtom::SymbolIterator
                | PredefinedAtom::SymbolMatch
                | PredefinedAtom::SymbolMatchAll
                | PredefinedAtom::SymbolReplace
                | PredefinedAtom::SymbolSearch
                | PredefinedAtom::SymbolSplit
                | PredefinedAtom::SymbolToStringTag
                | PredefinedAtom::SymbolIsConcatSpreadable
                | PredefinedAtom::SymbolHasInstance
                | PredefinedAtom::SymbolSpecies
                | PredefinedAtom::SymbolUnscopables
        )
    }
    pub const fn to_str(self) -> &'static str {
        match self {
            PredefinedAtom::Null => "null",
            PredefinedAtom::False => "false",
            PredefinedAtom::True => "true",
            PredefinedAtom::If => "if",
            PredefinedAtom::Else => "else",
            PredefinedAtom::Return => "return",
            PredefinedAtom::Var => "var",
            PredefinedAtom::This => "this",
            PredefinedAtom::Delete => "delete",
            PredefinedAtom::Void => "void",
            PredefinedAtom::Typeof => "typeof",
            PredefinedAtom::New => "new",
            PredefinedAtom::In => "in",
            PredefinedAtom::Instanceof => "instanceof",
            PredefinedAtom::Do => "do",
            PredefinedAtom::While => "while",
            PredefinedAtom::For => "for",
            PredefinedAtom::Break => "break",
            PredefinedAtom::Continue => "continue",
            PredefinedAtom::Switch => "switch",
            PredefinedAtom::Case => "case",
            PredefinedAtom::Default => "default",
            PredefinedAtom::Throw => "throw",
            PredefinedAtom::Try => "try",
            PredefinedAtom::Catch => "catch",
            PredefinedAtom::Finally => "finally",
            PredefinedAtom::FunctionKw => "function",
            PredefinedAtom::Debugger => "debugger",
            PredefinedAtom::With => "with",
            PredefinedAtom::Class => "class",
            PredefinedAtom::Const => "const",
            PredefinedAtom::Enum => "enum",
            PredefinedAtom::Export => "export",
            PredefinedAtom::Extends => "extends",
            PredefinedAtom::Import => "import",
            PredefinedAtom::Super => "super",
            PredefinedAtom::Implements => "implements",
            PredefinedAtom::Interface => "interface",
            PredefinedAtom::Let => "let",
            PredefinedAtom::Package => "package",
            PredefinedAtom::Private => "private",
            PredefinedAtom::Protected => "protected",
            PredefinedAtom::Public => "public",
            PredefinedAtom::Static => "static",
            PredefinedAtom::Yield => "yield",
            PredefinedAtom::Await => "await",
            PredefinedAtom::Empty => "",
            PredefinedAtom::Length => "length",
            PredefinedAtom::Message => "message",
            PredefinedAtom::Errors => "errors",
            PredefinedAtom::Stack => "stack",
            PredefinedAtom::Name => "name",
            PredefinedAtom::ToString => "toString",
            PredefinedAtom::ToLocaleString => "toLocaleString",
            PredefinedAtom::ValueOf => "valueOf",
            PredefinedAtom::Eval => "eval",
            PredefinedAtom::Prototype => "prototype",
            PredefinedAtom::Constructor => "constructor",
            PredefinedAtom::Configurable => "configurable",
            PredefinedAtom::Writable => "writable",
            PredefinedAtom::Enumerable => "enumerable",
            PredefinedAtom::Value => "value",
            PredefinedAtom::Getter => "get",
            PredefinedAtom::Setter => "set",
            PredefinedAtom::Of => "of",
            PredefinedAtom::UnderscoreProto => "__proto__",
            PredefinedAtom::Undefined => "undefined",
            PredefinedAtom::NumberLower => "number",
            PredefinedAtom::BooleanLower => "boolean",
            PredefinedAtom::StringLower => "string",
            PredefinedAtom::ObjectLower => "object",
            PredefinedAtom::SymbolLower => "symbol",
            PredefinedAtom::Integer => "integer",
            PredefinedAtom::Unknown => "unknown",
            PredefinedAtom::ArgumentsLower => "arguments",
            PredefinedAtom::Callee => "callee",
            PredefinedAtom::Caller => "caller",
            PredefinedAtom::LastIndex => "lastIndex",
            PredefinedAtom::Target => "target",
            PredefinedAtom::Index => "index",
            PredefinedAtom::Input => "input",
            PredefinedAtom::DefineProperties => "defineProperties",
            PredefinedAtom::Apply => "apply",
            PredefinedAtom::Join => "join",
            PredefinedAtom::Concat => "concat",
            PredefinedAtom::Split => "split",
            PredefinedAtom::Construct => "construct",
            PredefinedAtom::GetPrototypeOf => "getPrototypeOf",
            PredefinedAtom::SetPrototypeOf => "setPrototypeOf",
            PredefinedAtom::IsExtensible => "isExtensible",
            PredefinedAtom::PreventExtensions => "preventExtensions",
            PredefinedAtom::Has => "has",
            PredefinedAtom::DeleteProperty => "deleteProperty",
            PredefinedAtom::DefineProperty => "defineProperty",
            PredefinedAtom::GetOwnPropertyDescriptor => "getOwnPropertyDescriptor",
            PredefinedAtom::OwnKeys => "ownKeys",
            PredefinedAtom::Add => "add",
            PredefinedAtom::Done => "done",
            PredefinedAtom::Next => "next",
            PredefinedAtom::Values => "values",
            PredefinedAtom::Source => "source",
            PredefinedAtom::Flags => "flags",
            PredefinedAtom::Global => "global",
            PredefinedAtom::Unicode => "unicode",
            PredefinedAtom::Raw => "raw",
            PredefinedAtom::NewTarget => "new.target",
            PredefinedAtom::ThisActiveFunc => "this.active_func",
            PredefinedAtom::HomeObject => "<home_object>",
            PredefinedAtom::ComputedField => "<computed_field>",
            PredefinedAtom::StaticComputedField => "<static_computed_field>",
            PredefinedAtom::ClassFieldsInit => "<class_fields_init>",
            PredefinedAtom::Brand => "<brand>",
            PredefinedAtom::HashConstructor => "#constructor",
            PredefinedAtom::As => "as",
            PredefinedAtom::From => "from",
            PredefinedAtom::Meta => "meta",
            PredefinedAtom::StarDefault => "*default*",
            PredefinedAtom::Star => "*",
            PredefinedAtom::Module => "Module",
            PredefinedAtom::Then => "then",
            PredefinedAtom::Resolve => "resolve",
            PredefinedAtom::Reject => "reject",
            PredefinedAtom::PromiseLower => "promise",
            PredefinedAtom::ProxyLower => "proxy",
            PredefinedAtom::Revoke => "revoke",
            PredefinedAtom::Async => "async",
            PredefinedAtom::Exec => "exec",
            PredefinedAtom::Groups => "groups",
            PredefinedAtom::Status => "status",
            PredefinedAtom::Reason => "reason",
            PredefinedAtom::GlobalThis => "globalThis",
            PredefinedAtom::Bigint => "bigint",
            PredefinedAtom::ToJSON => "toJSON",
            PredefinedAtom::MaxByteLength => "maxByteLength",
            PredefinedAtom::Object => "Object",
            PredefinedAtom::Array => "Array",
            PredefinedAtom::Error => "Error",
            PredefinedAtom::Number => "Number",
            PredefinedAtom::String => "String",
            PredefinedAtom::Boolean => "Boolean",
            PredefinedAtom::Symbol => "Symbol",
            PredefinedAtom::Arguments => "Arguments",
            PredefinedAtom::Math => "Math",
            PredefinedAtom::JSON => "JSON",
            PredefinedAtom::Date => "Date",
            PredefinedAtom::Function => "Function",
            PredefinedAtom::GeneratorFunction => "GeneratorFunction",
            PredefinedAtom::ForInIterator => "ForInIterator",
            PredefinedAtom::RegExp => "RegExp",
            PredefinedAtom::ArrayBuffer => "ArrayBuffer",
            PredefinedAtom::SharedArrayBuffer => "SharedArrayBuffer",
            PredefinedAtom::Uint8ClampedArray => "Uint8ClampedArray",
            PredefinedAtom::Int8Array => "Int8Array",
            PredefinedAtom::Uint8Array => "Uint8Array",
            PredefinedAtom::Int16Array => "Int16Array",
            PredefinedAtom::Uint16Array => "Uint16Array",
            PredefinedAtom::Int32Array => "Int32Array",
            PredefinedAtom::Uint32Array => "Uint32Array",
            PredefinedAtom::BigInt64Array => "BigInt64Array",
            PredefinedAtom::BigUint64Array => "BigUint64Array",
            PredefinedAtom::Float32Array => "Float32Array",
            PredefinedAtom::Float64Array => "Float64Array",
            PredefinedAtom::DataView => "DataView",
            PredefinedAtom::BigInt => "BigInt",
            PredefinedAtom::Map => "Map",
            PredefinedAtom::Set => "Set",
            PredefinedAtom::WeakMap => "WeakMap",
            PredefinedAtom::WeakSet => "WeakSet",
            PredefinedAtom::MapIterator => "Map Iterator",
            PredefinedAtom::SetIterator => "Set Iterator",
            PredefinedAtom::ArrayIterator => "Array Iterator",
            PredefinedAtom::StringIterator => "String Iterator",
            PredefinedAtom::RegExpStringIterator => "RegExp String Iterator",
            PredefinedAtom::Generator => "Generator",
            PredefinedAtom::Proxy => "Proxy",
            PredefinedAtom::Promise => "Promise",
            PredefinedAtom::PromiseResolveFunction => "PromiseResolveFunction",
            PredefinedAtom::PromiseRejectFunction => "PromiseRejectFunction",
            PredefinedAtom::AsyncFunction => "AsyncFunction",
            PredefinedAtom::AsyncFunctionResolve => "AsyncFunctionResolve",
            PredefinedAtom::AsyncFunctionReject => "AsyncFunctionReject",
            PredefinedAtom::AsyncGeneratorFunction => "AsyncGeneratorFunction",
            PredefinedAtom::AsyncGenerator => "AsyncGenerator",
            PredefinedAtom::EvalError => "EvalError",
            PredefinedAtom::RangeError => "RangeError",
            PredefinedAtom::ReferenceError => "ReferenceError",
            PredefinedAtom::SyntaxError => "SyntaxError",
            PredefinedAtom::TypeError => "TypeError",
            PredefinedAtom::URIError => "URIError",
            PredefinedAtom::InternalError => "InternalError",
            PredefinedAtom::SymbolAsyncIterator => "Symbol.asyncIterator",
            PredefinedAtom::SymbolIterator => "Symbol.iterator",
            PredefinedAtom::SymbolMatch => "Symbol.match",
            PredefinedAtom::SymbolMatchAll => "Symbol.matchAll",
            PredefinedAtom::SymbolReplace => "Symbol.replace",
            PredefinedAtom::SymbolSearch => "Symbol.search",
            PredefinedAtom::SymbolSplit => "Symbol.split",
            PredefinedAtom::SymbolToStringTag => "Symbol.toStringTag",
            PredefinedAtom::SymbolIsConcatSpreadable => "Symbol.isConcatSpreadable",
            PredefinedAtom::SymbolHasInstance => "Symbol.hasInstance",
            PredefinedAtom::SymbolSpecies => "Symbol.species",
            PredefinedAtom::SymbolUnscopables => "Symbol.unscopables",
        }
    }
}
#[cfg(test)]
mod test {
    use crate::{Atom, Context, IntoAtom, Runtime};
    use super::PredefinedAtom;
    #[test]
    fn string_correct() {
        static ALL_PREDEFS: &[PredefinedAtom] = &[
            PredefinedAtom::Null,
            PredefinedAtom::False,
            PredefinedAtom::True,
            PredefinedAtom::If,
            PredefinedAtom::Else,
            PredefinedAtom::Return,
            PredefinedAtom::Var,
            PredefinedAtom::This,
            PredefinedAtom::Delete,
            PredefinedAtom::Void,
            PredefinedAtom::Typeof,
            PredefinedAtom::New,
            PredefinedAtom::In,
            PredefinedAtom::Instanceof,
            PredefinedAtom::Do,
            PredefinedAtom::While,
            PredefinedAtom::For,
            PredefinedAtom::Break,
            PredefinedAtom::Continue,
            PredefinedAtom::Switch,
            PredefinedAtom::Case,
            PredefinedAtom::Default,
            PredefinedAtom::Throw,
            PredefinedAtom::Try,
            PredefinedAtom::Catch,
            PredefinedAtom::Finally,
            PredefinedAtom::FunctionKw,
            PredefinedAtom::Debugger,
            PredefinedAtom::With,
            PredefinedAtom::Class,
            PredefinedAtom::Const,
            PredefinedAtom::Enum,
            PredefinedAtom::Export,
            PredefinedAtom::Extends,
            PredefinedAtom::Import,
            PredefinedAtom::Super,
            PredefinedAtom::Implements,
            PredefinedAtom::Interface,
            PredefinedAtom::Let,
            PredefinedAtom::Package,
            PredefinedAtom::Private,
            PredefinedAtom::Protected,
            PredefinedAtom::Public,
            PredefinedAtom::Static,
            PredefinedAtom::Yield,
            PredefinedAtom::Await,
            PredefinedAtom::Empty,
            PredefinedAtom::Length,
            PredefinedAtom::Message,
            PredefinedAtom::Errors,
            PredefinedAtom::Stack,
            PredefinedAtom::Name,
            PredefinedAtom::ToString,
            PredefinedAtom::ToLocaleString,
            PredefinedAtom::ValueOf,
            PredefinedAtom::Eval,
            PredefinedAtom::Prototype,
            PredefinedAtom::Constructor,
            PredefinedAtom::Configurable,
            PredefinedAtom::Writable,
            PredefinedAtom::Enumerable,
            PredefinedAtom::Value,
            PredefinedAtom::Getter,
            PredefinedAtom::Setter,
            PredefinedAtom::Of,
            PredefinedAtom::UnderscoreProto,
            PredefinedAtom::Undefined,
            PredefinedAtom::NumberLower,
            PredefinedAtom::BooleanLower,
            PredefinedAtom::StringLower,
            PredefinedAtom::ObjectLower,
            PredefinedAtom::SymbolLower,
            PredefinedAtom::Integer,
            PredefinedAtom::Unknown,
            PredefinedAtom::ArgumentsLower,
            PredefinedAtom::Callee,
            PredefinedAtom::Caller,
            PredefinedAtom::LastIndex,
            PredefinedAtom::Target,
            PredefinedAtom::Index,
            PredefinedAtom::Input,
            PredefinedAtom::DefineProperties,
            PredefinedAtom::Apply,
            PredefinedAtom::Join,
            PredefinedAtom::Concat,
            PredefinedAtom::Split,
            PredefinedAtom::Construct,
            PredefinedAtom::GetPrototypeOf,
            PredefinedAtom::SetPrototypeOf,
            PredefinedAtom::IsExtensible,
            PredefinedAtom::PreventExtensions,
            PredefinedAtom::Has,
            PredefinedAtom::DeleteProperty,
            PredefinedAtom::DefineProperty,
            PredefinedAtom::GetOwnPropertyDescriptor,
            PredefinedAtom::OwnKeys,
            PredefinedAtom::Add,
            PredefinedAtom::Done,
            PredefinedAtom::Next,
            PredefinedAtom::Values,
            PredefinedAtom::Source,
            PredefinedAtom::Flags,
            PredefinedAtom::Global,
            PredefinedAtom::Unicode,
            PredefinedAtom::Raw,
            PredefinedAtom::NewTarget,
            PredefinedAtom::ThisActiveFunc,
            PredefinedAtom::HomeObject,
            PredefinedAtom::ComputedField,
            PredefinedAtom::StaticComputedField,
            PredefinedAtom::ClassFieldsInit,
            PredefinedAtom::Brand,
            PredefinedAtom::HashConstructor,
            PredefinedAtom::As,
            PredefinedAtom::From,
            PredefinedAtom::Meta,
            PredefinedAtom::StarDefault,
            PredefinedAtom::Star,
            PredefinedAtom::Module,
            PredefinedAtom::Then,
            PredefinedAtom::Resolve,
            PredefinedAtom::Reject,
            PredefinedAtom::PromiseLower,
            PredefinedAtom::ProxyLower,
            PredefinedAtom::Revoke,
            PredefinedAtom::Async,
            PredefinedAtom::Exec,
            PredefinedAtom::Groups,
            PredefinedAtom::Status,
            PredefinedAtom::Reason,
            PredefinedAtom::GlobalThis,
            PredefinedAtom::Bigint,
            PredefinedAtom::ToJSON,
            PredefinedAtom::Object,
            PredefinedAtom::Array,
            PredefinedAtom::Error,
            PredefinedAtom::Number,
            PredefinedAtom::String,
            PredefinedAtom::Boolean,
            PredefinedAtom::Symbol,
            PredefinedAtom::Arguments,
            PredefinedAtom::Math,
            PredefinedAtom::JSON,
            PredefinedAtom::Date,
            PredefinedAtom::Function,
            PredefinedAtom::GeneratorFunction,
            PredefinedAtom::ForInIterator,
            PredefinedAtom::RegExp,
            PredefinedAtom::ArrayBuffer,
            PredefinedAtom::SharedArrayBuffer,
            PredefinedAtom::Uint8ClampedArray,
            PredefinedAtom::Int8Array,
            PredefinedAtom::Uint8Array,
            PredefinedAtom::Int16Array,
            PredefinedAtom::Uint16Array,
            PredefinedAtom::Int32Array,
            PredefinedAtom::Uint32Array,
            PredefinedAtom::BigInt64Array,
            PredefinedAtom::BigUint64Array,
            PredefinedAtom::Float32Array,
            PredefinedAtom::Float64Array,
            PredefinedAtom::DataView,
            PredefinedAtom::BigInt,
            PredefinedAtom::Map,
            PredefinedAtom::Set,
            PredefinedAtom::WeakMap,
            PredefinedAtom::WeakSet,
            PredefinedAtom::MapIterator,
            PredefinedAtom::SetIterator,
            PredefinedAtom::ArrayIterator,
            PredefinedAtom::StringIterator,
            PredefinedAtom::RegExpStringIterator,
            PredefinedAtom::Generator,
            PredefinedAtom::Proxy,
            PredefinedAtom::Promise,
            PredefinedAtom::PromiseResolveFunction,
            PredefinedAtom::PromiseRejectFunction,
            PredefinedAtom::AsyncFunction,
            PredefinedAtom::AsyncFunctionResolve,
            PredefinedAtom::AsyncFunctionReject,
            PredefinedAtom::AsyncGeneratorFunction,
            PredefinedAtom::AsyncGenerator,
            PredefinedAtom::EvalError,
            PredefinedAtom::RangeError,
            PredefinedAtom::ReferenceError,
            PredefinedAtom::SyntaxError,
            PredefinedAtom::TypeError,
            PredefinedAtom::URIError,
            PredefinedAtom::InternalError,
            PredefinedAtom::SymbolAsyncIterator,
            PredefinedAtom::SymbolIterator,
            PredefinedAtom::SymbolMatch,
            PredefinedAtom::SymbolMatchAll,
            PredefinedAtom::SymbolReplace,
            PredefinedAtom::SymbolSearch,
            PredefinedAtom::SymbolSplit,
            PredefinedAtom::SymbolToStringTag,
            PredefinedAtom::SymbolIsConcatSpreadable,
            PredefinedAtom::SymbolHasInstance,
            PredefinedAtom::SymbolSpecies,
            PredefinedAtom::SymbolUnscopables,
        ];
        let rt = Runtime::new().unwrap();
        let context = Context::full(&rt).unwrap();
        context.with(|ctx| {
            for predef in ALL_PREDEFS {
                let atom = predef.into_atom(&ctx).unwrap();
                assert_eq!(atom.to_string().unwrap().as_str(), predef.to_str());
                if predef.is_symbol() {
                    continue;
                }
                let from_str = Atom::from_str(ctx.clone(), predef.to_str()).unwrap();
                assert_eq!(
                    atom,
                    from_str,
                    "Atom `{}` from str and from redefined not equal",
                    predef.to_str()
                )
            }
        })
    }
}