Tests that Runtime can properly release objects and object groups.

Running test: testReleaseObject
Evaluating 'var a = {x:3};'
Evaluating 'var b = {x:4};'
Evaluate 'this' for object a
{
    id : <messageId>
    result : {
        result : {
            className : Object
            description : Object
            objectId : <objectId>
            type : object
        }
    }
}
Evaluate 'this' for object b
{
    id : <messageId>
    result : {
        result : {
            className : Object
            description : Object
            objectId : <objectId>
            type : object
        }
    }
}
Release "a"
Evaluate 'this' for object a
{
    error : {
        code : -32000
        message : Could not find object with given id
    }
    id : <messageId>
}
Evaluate 'this' for object b
{
    id : <messageId>
    result : {
        result : {
            className : Object
            description : Object
            objectId : <objectId>
            type : object
        }
    }
}
Release "b"
Evaluate 'this' for object a
{
    error : {
        code : -32000
        message : Could not find object with given id
    }
    id : <messageId>
}
Evaluate 'this' for object b
{
    error : {
        code : -32000
        message : Could not find object with given id
    }
    id : <messageId>
}

Running test: testReleaseObjectInvalid
ReleaseObject with invalid params.
{
    error : {
        code : -32602
        data : Failed to deserialize params.objectId - BINDINGS: mandatory field missing at <some position>
        message : Invalid parameters
    }
    id : <messageId>
}

Running test: testObjectGroups
Evaluating 'var a = {x:3};'
Evaluating 'var b = {x:4};'
Evaluate "a" in objectGroup "x"
Evaluate "b" in objectGroup "y"
Evaluate 'this' for object a
{
    id : <messageId>
    result : {
        result : {
            className : Object
            description : Object
            objectId : <objectId>
            type : object
        }
    }
}
Evaluate 'this' for object b
{
    id : <messageId>
    result : {
        result : {
            className : Object
            description : Object
            objectId : <objectId>
            type : object
        }
    }
}
Release objectGroup "x"
Evaluate 'this' for object a
{
    error : {
        code : -32000
        message : Could not find object with given id
    }
    id : <messageId>
}
Evaluate 'this' for object b
{
    id : <messageId>
    result : {
        result : {
            className : Object
            description : Object
            objectId : <objectId>
            type : object
        }
    }
}
Release objectGroup "y"
Evaluate 'this' for object a
{
    error : {
        code : -32000
        message : Could not find object with given id
    }
    id : <messageId>
}
Evaluate 'this' for object b
{
    error : {
        code : -32000
        message : Could not find object with given id
    }
    id : <messageId>
}

Running test: testReleaseObjectGroupInvalid
ReleaseObjectGroup with invalid params
{
    error : {
        code : -32602
        data : Failed to deserialize params.objectGroup - BINDINGS: mandatory field missing at <some position>
        message : Invalid parameters
    }
    id : <messageId>
}
