/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

'use strict';

require('jasmine-expect');

const Util = require('util');
const TestingHelper = require('../TestingHelper');
const { IgniteClient, ObjectType, MapObjectType, ComplexObjectType, BinaryObject } = require('apache-ignite-client');

const CACHE_NAME = '__test_cache';
const ONE_BYTE_MAX_OFFSET = 0x100 - 1;
const TWO_BYTES_MAX_OFFSET = 0x10000 - 1;
const COMPLEX_OBJECT_HEADER_LENGTH = 24;

class Class1 {
    constructor() {
        this.field_1_1 = null;
        this.field_1_2 = new Class2();
        this.field_1_3 = null;
    }
}

class SubClass1 extends Class1 {
    constructor() {
        super();
        this.field_1_4 = null;
        this.field_1_5 = new Class3();
        this.field_1_6 = null;
        this.field_1_7 = null;
        this.field_1_8 = null;
    }
}

class Class2 {
    constructor() {
        this.field_2_1 = null;
        this.field_2_2 = null;
    }
}

class Class3 {
    constructor() {
        this.field_3_1 = null;
        this.field_3_2 = null;
    }
}

describe('complex object test suite >', () => {
    let igniteClient = null;

    beforeAll((done) => {
        Promise.resolve().
            then(async () => {
                await TestingHelper.init();
                igniteClient = TestingHelper.igniteClient;
                await testSuiteCleanup(done);
                await igniteClient.getOrCreateCache(CACHE_NAME);
            }).
            then(done).
            catch(error => done.fail(error));
    }, TestingHelper.TIMEOUT);

    afterAll((done) => {
        Promise.resolve().
            then(async () => {
                await testSuiteCleanup(done);
                await TestingHelper.cleanUp();
            }).
            then(done).
            catch(error => done.fail(error));
    }, TestingHelper.TIMEOUT);

    it('put get complex objects', (done) => {
        Promise.resolve().
            then(async () => {
                const value1 = new Class1();
                value1.field_1_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.BYTE);
                value1.field_1_2.field_2_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.SHORT);
                value1.field_1_2.field_2_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.INTEGER);
                value1.field_1_3 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.LONG);

                const valueType1 = new ComplexObjectType(new Class1()).
                    setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.BYTE).
                    setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2ShortInteger').
                        setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.SHORT).
                        setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.INTEGER)).
                    setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.LONG);

                const value2 = new SubClass1();
                value2.field_1_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.FLOAT);
                value2.field_1_2.field_2_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DOUBLE);
                value2.field_1_2.field_2_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.CHAR);
                value2.field_1_3 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.BOOLEAN);
                value2.field_1_4 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.STRING);
                value2.field_1_5.field_3_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DATE);
                value2.field_1_5.field_3_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.UUID);
                value2.field_1_6 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DECIMAL);
                value2.field_1_7 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.TIMESTAMP);
                value2.field_1_8 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.TIME);

                const valueType2 = new ComplexObjectType(new SubClass1()).
                    setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.FLOAT).
                    setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2DoubleChar').
                        setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.DOUBLE).
                        setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.CHAR)).
                    setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.BOOLEAN).
                    setFieldType('field_1_4', ObjectType.PRIMITIVE_TYPE.STRING).
                    setFieldType('field_1_5', new ComplexObjectType(new Class3()).
                        setFieldType('field_3_1', ObjectType.PRIMITIVE_TYPE.DATE).
                        setFieldType('field_3_2', ObjectType.PRIMITIVE_TYPE.UUID)).
                    setFieldType('field_1_6', ObjectType.PRIMITIVE_TYPE.DECIMAL).
                    setFieldType('field_1_7', ObjectType.PRIMITIVE_TYPE.TIMESTAMP).
                    setFieldType('field_1_8', ObjectType.PRIMITIVE_TYPE.TIME);

                await putGetComplexObjectsWithDifferentTypes(
                    value1, value2, valueType1, valueType2, Class1, SubClass1);
            }).
            then(done).
            catch(error => done.fail(error));
    });

    it('put get unnamed complex objects', (done) => {
        Promise.resolve().
            then(async () => {
                const value1 = {};
                value1.field_1_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.BYTE);
                value1.field_1_2 = {};
                value1.field_1_2.field_2_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.SHORT);
                value1.field_1_2.field_2_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.INTEGER);
                value1.field_1_3 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.LONG);

                const valueType1 = new ComplexObjectType(value1, 'ObjectWithByteObjLong').
                    setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.BYTE).
                    setFieldType('field_1_2', new ComplexObjectType(value1.field_1_2, 'ObjectWithShortInteger').
                        setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.SHORT).
                        setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.INTEGER)).
                    setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.LONG);

                const value2 = {};
                value2.field_1_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.FLOAT);
                value2.field_1_2 = {};
                value2.field_1_2.field_2_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DOUBLE);
                value2.field_1_2.field_2_2 = {};
                value2.field_1_2.field_2_2.field_3_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.CHAR);
                value2.field_1_2.field_2_2.field_3_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.BOOLEAN);
                value2.field_1_3 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.STRING);
                value2.field_1_4 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DATE);

                const valueType2 = new ComplexObjectType(value2, 'ObjectWithFloatObjStringDate').
                    setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.FLOAT).
                    setFieldType('field_1_2', new ComplexObjectType(value2.field_1_2, 'ObjectWithDoubleObj').
                        setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.DOUBLE).
                        setFieldType('field_2_2', new ComplexObjectType(value2.field_1_2.field_2_2, 'ObjectWithCharBoolean').
                            setFieldType('field_3_1', ObjectType.PRIMITIVE_TYPE.CHAR).
                            setFieldType('field_3_2', ObjectType.PRIMITIVE_TYPE.BOOLEAN))).
                    setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.STRING).
                    setFieldType('field_1_4', ObjectType.PRIMITIVE_TYPE.DATE);

                await putGetComplexObjects(value1, value2,
                    valueType1, valueType2, value2);

                await putGetComplexObjects({}, {},
                    new ComplexObjectType({}), new ComplexObjectType({}), {});

                let binaryKey = await BinaryObject.fromObject(value1, valueType1);
                let binaryValue = await BinaryObject.fromObject(value2, valueType2);
                await putGetComplexObjects(binaryKey, binaryValue,
                    null, null, value2);

                binaryKey = await BinaryObject.fromObject({});
                binaryValue = await BinaryObject.fromObject({});
                await putGetComplexObjects(binaryKey, binaryValue,
                    null, null, {});
            }).
            then(done).
            catch(error => done.fail(error));
    });

    it('put get complex objects with arrays', (done) => {
        Promise.resolve().
            then(async () => {
                const value1 = new Class1();
                value1.field_1_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.BYTE_ARRAY);
                value1.field_1_2.field_2_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.SHORT_ARRAY);
                value1.field_1_2.field_2_2 = getArrayValues(ObjectType.PRIMITIVE_TYPE.INTEGER_ARRAY);
                value1.field_1_3 = getArrayValues(ObjectType.PRIMITIVE_TYPE.LONG_ARRAY);

                const valueType1 = new ComplexObjectType(new Class1(), 'Class1WithArrays').
                    setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.BYTE_ARRAY).
                    setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithShortIntegerArrays').
                        setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.SHORT_ARRAY).
                        setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.INTEGER_ARRAY)).
                    setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.LONG_ARRAY);

                const value2 = new SubClass1();
                value2.field_1_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.FLOAT_ARRAY);
                value2.field_1_2.field_2_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.DOUBLE_ARRAY);
                value2.field_1_2.field_2_2 = getArrayValues(ObjectType.PRIMITIVE_TYPE.CHAR_ARRAY);
                value2.field_1_3 = getArrayValues(ObjectType.PRIMITIVE_TYPE.BOOLEAN_ARRAY);
                value2.field_1_4 = getArrayValues(ObjectType.PRIMITIVE_TYPE.STRING_ARRAY);
                value2.field_1_5.field_3_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.DATE_ARRAY);
                value2.field_1_5.field_3_2 = getArrayValues(ObjectType.PRIMITIVE_TYPE.UUID_ARRAY);
                value2.field_1_6 = getArrayValues(ObjectType.PRIMITIVE_TYPE.DECIMAL_ARRAY);
                value2.field_1_7 = getArrayValues(ObjectType.PRIMITIVE_TYPE.TIMESTAMP_ARRAY);
                value2.field_1_8 = getArrayValues(ObjectType.PRIMITIVE_TYPE.TIME_ARRAY);

                const valueType2 = new ComplexObjectType(new SubClass1(), 'SubClass1WithArrays').
                    setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.FLOAT_ARRAY).
                    setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithDoubleCharArrays').
                        setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.DOUBLE_ARRAY).
                        setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.CHAR_ARRAY)).
                    setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.BOOLEAN_ARRAY).
                    setFieldType('field_1_4', ObjectType.PRIMITIVE_TYPE.STRING_ARRAY).
                    setFieldType('field_1_5', new ComplexObjectType(new Class3(), 'Class3WithArrays').
                        setFieldType('field_3_1', ObjectType.PRIMITIVE_TYPE.DATE_ARRAY).
                        setFieldType('field_3_2', ObjectType.PRIMITIVE_TYPE.UUID_ARRAY)).
                    setFieldType('field_1_6', ObjectType.PRIMITIVE_TYPE.DECIMAL_ARRAY).
                    setFieldType('field_1_7', ObjectType.PRIMITIVE_TYPE.TIMESTAMP_ARRAY).
                    setFieldType('field_1_8', ObjectType.PRIMITIVE_TYPE.TIME_ARRAY);

                await putGetComplexObjectsWithDifferentTypes(
                    value1, value2, valueType1, valueType2, Class1, SubClass1, true);
            }).
            then(done).
            catch(error => done.fail(error));
    });

    it('put get complex objects with maps', (done) => {
        Promise.resolve().
            then(async () => {
                const value1 = new Class1();
                value1.field_1_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.BYTE);
                value1.field_1_2.field_2_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.SHORT);
                value1.field_1_2.field_2_2 = getMapValue(ObjectType.PRIMITIVE_TYPE.INTEGER);
                value1.field_1_3 = getMapValue(ObjectType.PRIMITIVE_TYPE.LONG);

                const valueType1 = new ComplexObjectType(new Class1(), 'Class1WithMaps').
                    setFieldType('field_1_1', new MapObjectType(
                        MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.BYTE, ObjectType.PRIMITIVE_TYPE.BYTE)).
                    setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithShortIntegerMaps').
                        setFieldType('field_2_1', new MapObjectType(
                            MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.SHORT, ObjectType.PRIMITIVE_TYPE.SHORT)).
                        setFieldType('field_2_2', new MapObjectType(
                            MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.INTEGER, ObjectType.PRIMITIVE_TYPE.INTEGER))).
                    setFieldType('field_1_3', new MapObjectType(
                        MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.LONG, ObjectType.PRIMITIVE_TYPE.LONG));

                const value2 = new SubClass1();
                value2.field_1_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.FLOAT);
                value2.field_1_2.field_2_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.DOUBLE);
                value2.field_1_2.field_2_2 = getMapValue(ObjectType.PRIMITIVE_TYPE.CHAR);
                value2.field_1_3 = getMapValue(ObjectType.PRIMITIVE_TYPE.BOOLEAN);
                value2.field_1_4 = getMapValue(ObjectType.PRIMITIVE_TYPE.STRING);
                value2.field_1_5.field_3_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.DATE);
                value2.field_1_5.field_3_2 = getMapValue(ObjectType.PRIMITIVE_TYPE.UUID);
                value2.field_1_6 = getMapValue(ObjectType.PRIMITIVE_TYPE.DECIMAL);
                value2.field_1_7 = getMapValue(ObjectType.PRIMITIVE_TYPE.TIMESTAMP);
                value2.field_1_8 = getMapValue(ObjectType.PRIMITIVE_TYPE.TIME);

                const valueType2 = new ComplexObjectType(new SubClass1(), 'SubClass1WithMaps').
                    setFieldType('field_1_1', new MapObjectType(
                        MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.FLOAT)).
                    setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithDoubleCharMaps').
                        setFieldType('field_2_1', new MapObjectType(
                            MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.DOUBLE)).
                        setFieldType('field_2_2', new MapObjectType(
                            MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.CHAR, ObjectType.PRIMITIVE_TYPE.CHAR))).
                    setFieldType('field_1_3', new MapObjectType(
                        MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.BOOLEAN, ObjectType.PRIMITIVE_TYPE.BOOLEAN)).
                    setFieldType('field_1_4', new MapObjectType(
                        MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.STRING)).
                    setFieldType('field_1_5', new ComplexObjectType(new Class3(), 'Class3WithMaps').
                        setFieldType('field_3_1', new MapObjectType(
                            MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.DATE)).
                        setFieldType('field_3_2', new MapObjectType(
                            MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.UUID))).
                    setFieldType('field_1_6', new MapObjectType(
                        MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.DECIMAL)).
                    setFieldType('field_1_7', new MapObjectType(
                        MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.TIMESTAMP)).
                    setFieldType('field_1_8', new MapObjectType(
                        MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.TIME));

                await putGetComplexObjectsWithDifferentTypes(
                    value1, value2, valueType1, valueType2, Class1, SubClass1, true);
            }).
            then(done).
            catch(error => done.fail(error));
    });

    it('put get binary objects from objects', (done) => {
        Promise.resolve().
            then(async () => {
                const valueType = new ComplexObjectType(new Class1(), 'Class1WithStringObjStringArray').
                    setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.STRING).
                    setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithShortBoolean').
                        setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.SHORT).
                        setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.BOOLEAN)).
                    setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.STRING_ARRAY);
                await putGetBinaryObjects(valueType);
                const defaultValueType = new ComplexObjectType(new Class1(), 'Class1Default').
                    setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2Default'));
                await putGetBinaryObjects(defaultValueType);
            }).
            then(done).
            catch(error => done.fail(error));
    });

    it('put get complex objects with one byte offset', (done) => {
        Promise.resolve().
            then(async () => {
                const key = new Date();
                const valueType = new ComplexObjectType(new Class2(), 'Class2WithStrings');
                const value = new Class2();
                value.field_2_1 = 'x';
                value.field_2_2 = 'y';
                await putGetComplexObjects(key, value, null, valueType, value);
                const oneByteMaxLen = getMaxFieldLength(true);
                value.field_2_1 = 'x'.repeat(oneByteMaxLen);
                value.field_2_2 = 'y';
                await putGetComplexObjects(key, value, null, valueType, value);
            }).
            then(done).
            catch(error => done.fail(error));
    });

    it('put get complex objects with two bytes offset', (done) => {
        Promise.resolve().
            then(async () => {
                const key = new Date();
                const valueType = new ComplexObjectType(new Class2(), 'Class2WithStrings');
                const value = new Class2();
                const oneByteMaxLen = getMaxFieldLength(true);
                value.field_2_1 = 'x'.repeat(oneByteMaxLen + 1);
                value.field_2_2 = 'y';
                await putGetComplexObjects(key, value, null, valueType, value);
                const twoBytesMaxLen = getMaxFieldLength(false);
                value.field_2_1 = 'x'.repeat(twoBytesMaxLen);
                value.field_2_2 = 'y';
                await putGetComplexObjects(key, value, null, valueType, value);
            }).
            then(done).
            catch(error => done.fail(error));
    });

    it('put get complex objects with four bytes offset', (done) => {
        Promise.resolve().
            then(async () => {
                const key = new Date();
                const valueType = new ComplexObjectType(new Class2(), 'Class2WithStrings');
                const value = new Class2();
                const twoBytesMaxLen = getMaxFieldLength(false);
                value.field_2_1 = 'x'.repeat(twoBytesMaxLen + 1);
                value.field_2_2 = 'y';
                await putGetComplexObjects(key, value, null, valueType, value);
                value.field_2_1 = 'x'.repeat(twoBytesMaxLen * 2);
                value.field_2_2 = 'y';
                await putGetComplexObjects(key, value, null, valueType, value);
            }).
            then(done).
            catch(error => done.fail(error));
    });

    it('put get complex objects without schema', (done) => {
        Promise.resolve().
            then(async () => {
                const key = new Date();
                const valueType = new ComplexObjectType({});
                const value = {};
                await putGetComplexObjects(key, value, null, valueType, value);
            }).
            then(done).
            catch(error => done.fail(error));
    });

    function getMaxFieldLength(oneByte) {
        const maxOffset = oneByte ? ONE_BYTE_MAX_OFFSET : TWO_BYTES_MAX_OFFSET;
        // max offset - field type code - field type (string) length - complex object header length
        return maxOffset - 1 - 4 - COMPLEX_OBJECT_HEADER_LENGTH;
    }

    async function testSuiteCleanup(done) {
        await TestingHelper.destroyCache(CACHE_NAME, done);
    }

    async function putGetComplexObjects(key, value, keyType, valueType, valuePattern) {
        const cache = igniteClient.getCache(CACHE_NAME).setKeyType(keyType).setValueType(valueType);
        try {
            await cache.put(key, value);
            const result = await cache.get(key);
            expect(await TestingHelper.compare(valuePattern, result)).toBe(true,
                `values are not equal: put value=${TestingHelper.printValue(valuePattern)}, get value=${TestingHelper.printValue(result)}`);
        }
        finally {
            await cache.removeAll();
        }
    }

    async function binaryObjectEquals(binaryObj, valuePattern, valueType) {
        expect(await TestingHelper.compare(valuePattern, binaryObj)).toBe(true,
            `binary values are not equal: put value=${TestingHelper.printValue(valuePattern)}, get value=${TestingHelper.printValue(binaryObj)}`);

        let value1, value2;
        for (let key of Object.keys(valuePattern)) {
            value1 = valuePattern[key];
            value2 = await binaryObj.getField(key, valueType ? valueType._getFieldType(key) : null);
            expect(await TestingHelper.compare(value1, value2)).toBe(true,
                `values for key ${key} are not equal: put value=${TestingHelper.printValue(value1)
                }, get value=${TestingHelper.printValue(value2)}`);
        }

        if (valueType) {
            const toObject = await binaryObj.toObject(valueType);
            expect(await TestingHelper.compare(valuePattern, toObject)).toBe(true,
                `values are not equal: put value=${TestingHelper.printValue(valuePattern)}, get value=${TestingHelper.printValue(toObject)}`);
        }
    }

    async function putGetComplexObjectsWithDifferentTypes(
        key, value, keyType, valueType, keyClass, valueClass, isNullable = false) {
        await putGetComplexObjects(key, value, keyType, valueType, value);

        if (isNullable) {
            await putGetComplexObjects(new keyClass(), new valueClass(), keyType, valueType, new valueClass());
        }

        let binaryKey = await BinaryObject.fromObject(key, keyType);
        let binaryValue = await BinaryObject.fromObject(value, valueType);
        await putGetComplexObjects(binaryKey, binaryValue, null, null, value);

        if (isNullable) {
            binaryKey = await BinaryObject.fromObject(new keyClass(), keyType);
            binaryValue = await BinaryObject.fromObject(new valueClass(), valueType);
            await putGetComplexObjects(binaryKey, binaryValue, null, null, new valueClass());
        }
    }

    async function putGetBinaryObjects(valueType) {
        const value1 = new Class1();
        value1.field_1_1 = 'abc';
        value1.field_1_2.field_2_1 = 1234;
        value1.field_1_2.field_2_2 = true;
        value1.field_1_3 = ['a', 'bb', 'ccc'];

        const value2 = new Class1();
        value2.field_1_1 = 'def';
        value2.field_1_2.field_2_1 = 5432;
        value2.field_1_2.field_2_2 = false;
        value2.field_1_3 = ['a', 'bb', 'ccc', 'dddd'];

        const value3 = new Class1();
        value3.field_1_1 = 'defdef';
        value3.field_1_2.field_2_1 = 543;
        value3.field_1_2.field_2_2 = false;
        value3.field_1_3 = ['a', 'bb', 'ccc', 'dddd', 'eeeee'];

        const field_1_2_Type = valueType ? valueType._getFieldType('field_1_2') : null;

        const binaryValue1 = await BinaryObject.fromObject(value1, valueType);
        const binaryValue2 = await BinaryObject.fromObject(value2, valueType);
        const binaryValue3 = await BinaryObject.fromObject(value3, valueType);

        const cache = igniteClient.getCache(CACHE_NAME);
        try {
            await cache.put(binaryValue1, binaryValue2);
            let result = await cache.get(binaryValue1);
            await binaryObjectEquals(result, value2, valueType);

            binaryValue1.setField('field_1_1', 'abcde');
            result = await cache.get(binaryValue1);
            expect(result === null).toBe(true);

            binaryValue2.setField('field_1_1', value3.field_1_1);
            binaryValue2.setField('field_1_2', value3.field_1_2, field_1_2_Type);
            binaryValue2.setField('field_1_3', value3.field_1_3);
            await cache.put(binaryValue1, binaryValue2);
            result = await cache.get(binaryValue1);
            await binaryObjectEquals(result, value3, valueType);

            binaryValue1.setField('field_1_1', 'abc');
            binaryValue1.setField('field_1_3', await binaryValue1.getField('field_1_3'));
            result = await cache.get(binaryValue1);
            await binaryObjectEquals(result, value2, valueType);

            result = await cache.get(binaryValue1);
            await binaryObjectEquals(result, value2, valueType);

            binaryValue3.setField('field_1_1', await result.getField('field_1_1'));
            binaryValue3.setField('field_1_2', await result.getField('field_1_2', field_1_2_Type), field_1_2_Type);
            binaryValue3.setField('field_1_3', await result.getField('field_1_3'));
            await cache.put(binaryValue1, binaryValue3);
            result = await cache.get(binaryValue1);
            await binaryObjectEquals(result, value2, valueType);
        }
        finally {
            await cache.removeAll();
        }
    }

    function getPrimitiveValue(typeCode) {
        return TestingHelper.primitiveValues[typeCode].values[0];
    }

    function getArrayValues(typeCode) {
        return TestingHelper.primitiveValues[TestingHelper.arrayValues[typeCode].elemType].values;
    }

    function getMapValue(typeCode) {
        const map = new Map();
        const values = TestingHelper.primitiveValues[typeCode].values;
        const length = values.length;
        values.forEach((value, index) => {
            if (!TestingHelper.primitiveValues[typeCode].isMapKey) {
                value = Util.format("%s", value);
            }
            map.set(value, values[length - index - 1]);
        });
        return map;
    }
});
