Check internal properties reported in object preview.

Running test: boxedObjects
expression: new Number(239)
{
    name : [[PrimitiveValue]]
    type : number
    value : 239
}

expression: new Boolean(false)
{
    name : [[PrimitiveValue]]
    type : boolean
    value : false
}

expression: new String("abc")
{
    name : [[PrimitiveValue]]
    type : string
    value : abc
}

expression: Object(Symbol(42))
{
    name : [[PrimitiveValue]]
    type : symbol
    value : Symbol(42)
}

expression: Object(BigInt(2))
{
    name : [[PrimitiveValue]]
    type : bigint
    value : 2n
}


Running test: promise
expression: Promise.resolve(42)
{
    name : [[PromiseStatus]]
    type : string
    value : resolved
}
{
    name : [[PromiseValue]]
    type : number
    value : 42
}

expression: new Promise(() => undefined)
{
    name : [[PromiseStatus]]
    type : string
    value : pending
}
{
    name : [[PromiseValue]]
    type : undefined
    value : undefined
}


Running test: generatorObject
expression: (function* foo() { yield 1 })()
{
    name : [[GeneratorStatus]]
    type : string
    value : suspended
}


Running test: entriesInMapAndSet
expression: new Map([[1,2]])
[[Entries]]:
[
    [0] : {
        key : {
            description : 1
            overflow : false
            properties : [
            ]
            type : number
        }
        value : {
            description : 2
            overflow : false
            properties : [
            ]
            type : number
        }
    }
]

expression: new Set([1])
[[Entries]]:
[
    [0] : {
        value : {
            description : 1
            overflow : false
            properties : [
            ]
            type : number
        }
    }
]

expression: new WeakMap([[{}, 42]])
[[Entries]]:
[
    [0] : {
        key : {
            description : Object
            overflow : false
            properties : [
            ]
            type : object
        }
        value : {
            description : 42
            overflow : false
            properties : [
            ]
            type : number
        }
    }
]

expression: new WeakSet([{}])
[[Entries]]:
[
    [0] : {
        value : {
            description : Object
            overflow : false
            properties : [
            ]
            type : object
        }
    }
]


Running test: iteratorObject
expression: (new Map([[1,2]])).entries()
[[Entries]]:
[
    [0] : {
        key : {
            description : 1
            overflow : false
            properties : [
            ]
            type : number
        }
        value : {
            description : 2
            overflow : false
            properties : [
            ]
            type : number
        }
    }
]

expression: (new Set([1,2])).entries()
[[Entries]]:
[
    [0] : {
        key : {
            description : 1
            overflow : false
            properties : [
            ]
            type : number
        }
        value : {
            description : 1
            overflow : false
            properties : [
            ]
            type : number
        }
    }
    [1] : {
        key : {
            description : 2
            overflow : false
            properties : [
            ]
            type : number
        }
        value : {
            description : 2
            overflow : false
            properties : [
            ]
            type : number
        }
    }
]


Running test: noPreviewForFunctionObject
(function foo(){})
{
    id : <messageId>
    result : {
        result : {
            className : Function
            description : function foo(){}
            objectId : <objectId>
            type : function
        }
    }
}

Running test: otherObjects
expression: [1,2,3]
{
    name : 0
    type : number
    value : 1
}
{
    name : 1
    type : number
    value : 2
}
{
    name : 2
    type : number
    value : 3
}

expression: /123/
{
    name : lastIndex
    type : number
    value : 0
}

expression: ({})


Running test: overridenArrayGetter
expression: Promise.resolve(42)
{
    name : [[PromiseStatus]]
    type : string
    value : resolved
}
{
    name : [[PromiseValue]]
    type : number
    value : 42
}

Running test: privateNames
expression: new class { #foo = 1; #bar = 2; baz = 3;}
{
    name : #foo
    type : number
    value : 1
}
{
    name : #bar
    type : number
    value : 2
}
{
    name : baz
    type : number
    value : 3
}

expression: new class extends class { #baz = 3; } { #foo = 1; #bar = 2; }
{
    name : #baz
    type : number
    value : 3
}
{
    name : #foo
    type : number
    value : 1
}
{
    name : #bar
    type : number
    value : 2
}

expression: new class extends class { constructor() { return new Proxy({}, {}); } } { #foo = 1; #bar = 2; }
