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 : [[PromiseState]]
    type : string
    value : fulfilled
}
{
    name : [[PromiseResult]]
    type : number
    value : 42
}

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


Running test: generatorObject
expression: (function* foo() { yield 1 })()
{
    name : [[GeneratorState]]
    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 : [[PromiseState]]
    type : string
    value : fulfilled
}
{
    name : [[PromiseResult]]
    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; }


Running test: functionProxy
expression: new Proxy(() => {}, { get: () => x++ })
{
    name : length
    type : number
    value : 0
}
{
    name : name
    type : string
    value : 
}

