/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Licensed 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.
*/
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'deccjsunit/index'
import dataPreferences from '@ohos.data.preferences'
import featureAbility from '@ohos.ability.featureAbility';

const NAME = 'test_preferences';
const KEY_TEST_INT_ELEMENT = 'key_test_int';
const KEY_TEST_LONG_ELEMENT = 'key_test_long';
const KEY_TEST_FLOAT_ELEMENT = 'key_test_float';
const KEY_TEST_BOOLEAN_ELEMENT = 'key_test_boolean';
const KEY_TEST_STRING_ELEMENT = 'key_test_string';
const KEY_TEST_NUMBER_ARRAY_ELEMENT = 'key_test_number_array'
const KEY_TEST_STRING_ARRAY_ELEMENT = 'key_test_string_array'
const KEY_TEST_BOOL_ARRAY_ELEMENT = 'key_test_bool_array'
var mPreferences;
var context;

export default function preferencesPromiseTest(){
    describe('preferencesPromiseTest', function () {
        beforeAll(async function () {
            console.info('beforeAll')
            context = featureAbility.getContext()
            mPreferences = await dataPreferences.getPreferences(context, NAME);
        })

        afterAll(async function () {
            console.info('afterAll')
            await dataPreferences.deletePreferences(context, NAME);
        })

        /**
         * @tc.name put StringArray promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0010
         * @tc.desc put StringArray promise interface test
         */
        it('testPreferencesPutStringArray0131', 0, async function (done) {
            await mPreferences.clear();
            var stringArr = ['1', '2', '3']
            let promise1 = mPreferences.put(KEY_TEST_STRING_ARRAY_ELEMENT, stringArr)
            await promise1
            let promise2 = mPreferences.get(KEY_TEST_STRING_ARRAY_ELEMENT, ['123', '321'])
            promise2.then((pre) => {
                for (let i = 0; i < stringArr.length; i++) {
                    expect(stringArr[i]).assertEqual(pre[i]);
                }

            }).catch((err) => {
                expect(null).assertFail();
            })
            await promise2

            done();
        });

        /**
         * @tc.name put NumberArray promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0020
         * @tc.desc put NumberArray promise interface test
         */
        it('testPreferencesPutNumberArray0132', 0, async function (done) {
            await mPreferences.clear();
            var numberArr = [11, 22, 33, 44, 55]
            let promise1 = mPreferences.put(KEY_TEST_NUMBER_ARRAY_ELEMENT, numberArr)
            await promise1
            let promise2 = mPreferences.get(KEY_TEST_NUMBER_ARRAY_ELEMENT, [123, 321])
            promise2.then((pre) => {
                for (let i = 0; i < numberArr.length; i++) {
                    expect(numberArr[i]).assertEqual(pre[i]);
                }
            }).catch((err) => {
                expect(null).assertFail();
            })
            await promise2

            done();
        });

        /**
         * @tc.name put BoolArray promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0030
         * @tc.desc put BoolArray promise interface test
         */
        it('testPreferencesPutBoolArray0133', 0, async function (done) {
            await mPreferences.clear();
            var boolArr = [true, true, false]
            let promise1 = mPreferences.put(KEY_TEST_BOOL_ARRAY_ELEMENT, boolArr)
            await promise1
            let promise2 = mPreferences.get(KEY_TEST_BOOL_ARRAY_ELEMENT, [false, true])
            promise2.then((pre) => {
                for (let i = 0; i < boolArr.length; i++) {
                    expect(boolArr[i]).assertEqual(pre[i]);
                }
            }).catch((err) => {
                expect(null).assertFail();
            })
            await promise2

            done();
        });

        /**
         * @tc.name getAll promise interface test
         * @tc.number SUB_DDM_Preferences_GetAll_Promise_0040
         * @tc.desc getAll promise interface test
         */
        it('testPreferencesGetAll0001', 0, async function (done) {
            await mPreferences.clear();
            let doubleArr = [11, 22, 33]
            let stringArr = ['11', '22', '33']
            let boolArr = [true, false, false, true]
            await mPreferences.put(KEY_TEST_STRING_ARRAY_ELEMENT, stringArr)
            await mPreferences.put(KEY_TEST_BOOL_ARRAY_ELEMENT, boolArr)
            await mPreferences.put(KEY_TEST_NUMBER_ARRAY_ELEMENT, doubleArr)
            await mPreferences.put(KEY_TEST_BOOLEAN_ELEMENT, false)
            await mPreferences.put(KEY_TEST_STRING_ELEMENT, "123")
            await mPreferences.put(KEY_TEST_FLOAT_ELEMENT, 123.1)

            await mPreferences.flush()

            let promise = mPreferences.getAll()
            promise.then((obj) => {
                expect(false).assertEqual(obj.key_test_boolean)
                expect("123").assertEqual(obj.key_test_string)
                expect(123.1).assertEqual(obj.key_test_float)
                let sArr = obj.key_test_string_array
                for (let i = 0; i < sArr.length; i++) {
                    expect(sArr[i]).assertEqual(stringArr[i]);
                }

                let bArr = obj.key_test_bool_array
                for (let i = 0; i < bArr.length; i++) {
                    expect(bArr[i]).assertEqual(boolArr[i]);
                }

                let nArr = obj.key_test_number_array
                for (let i = 0; i < nArr.length; i++) {
                    expect(nArr[i]).assertEqual(doubleArr[i]);
                }
            }).catch((err) => {
                expect(null).assertFail();
            })
            await promise

            done();
        })

        /**
         * @tc.name clear promise interface test
         * @tc.number SUB_DDM_Preferences_Clear_Promise_0050
         * @tc.desc clear promise interface test
         */
        it('testPreferencesClear0011', 0, async function (done) {
            await mPreferences.put(KEY_TEST_STRING_ELEMENT, "test");
            await mPreferences.flush();
            const promise = mPreferences.clear();
            promise.then(async (ret) => {
                let per = await mPreferences.get(KEY_TEST_STRING_ELEMENT, "defaultvalue");
                expect("defaultvalue").assertEqual(per);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name has string interface test
         * @tc.number SUB_DDM_Preferences_Has_Promise_0060
         * @tc.desc has string interface test
         */
        it('testPreferencesHasKey0031', 0, async function (done) {
            await mPreferences.put(KEY_TEST_STRING_ELEMENT, "test");
            const promise = mPreferences.has(KEY_TEST_STRING_ELEMENT);
            promise.then((ret) => {
                expect(true).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name has int interface test
         * @tc.number SUB_DDM_Preferences_Has_Promise_0070
         * @tc.desc has int interface test
         */
        it('testPreferencesHasKey0032', 0, async function (done) {
            await mPreferences.put(KEY_TEST_INT_ELEMENT, 1);
            const promise = mPreferences.has(KEY_TEST_INT_ELEMENT);
            promise.then((ret) => {
                expect(true).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name has float interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0080
         * @tc.desc has float interface test
         */
        it('testPreferencesHasKey0033', 0, async function (done) {
            await mPreferences.put(KEY_TEST_FLOAT_ELEMENT, 2.0);
            const promise = mPreferences.has(KEY_TEST_FLOAT_ELEMENT);
            promise.then((ret) => {
                expect(true).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name has boolean interface test
         * @tc.number SUB_DDM_Preferences_Has_Promise_0090
         * @tc.desc has boolean interface test
         */
        it('testPreferencesHasKey0034', 0, async function (done) {
            await mPreferences.put(KEY_TEST_BOOLEAN_ELEMENT, false);
            const promise = mPreferences.has(KEY_TEST_BOOLEAN_ELEMENT);
            promise.then((ret) => {
                expect(true).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name has long interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0100
         * @tc.desc has long interface test
         */
        it('testPreferencesHasKey0035', 0, async function (done) {
            await mPreferences.put(KEY_TEST_LONG_ELEMENT, 0);
            const promise = mPreferences.has(KEY_TEST_LONG_ELEMENT);
            promise.then((ret) => {
                expect(true).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name get string promise interface test
         * @tc.number SUB_DDM_Preferences_Get_Promise_0110
         * @tc.desc get string promise interface test
         */
        it('testPreferencesGetDefValue0061', 0, async function (done) {
            await mPreferences.clear();
            const promise = mPreferences.get(KEY_TEST_STRING_ELEMENT, "defaultValue");
            promise.then((ret) => {
                expect('defaultValue').assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name get float promise interface test
         * @tc.number SUB_DDM_Preferences_Get_Promise_0120
         * @tc.desc get float promise interface test
         */
        it('testPreferencesGetFloat0071', 0, async function (done) {
            await mPreferences.clear();
            await mPreferences.put(KEY_TEST_FLOAT_ELEMENT, 3.0);
            const promise = mPreferences.get(KEY_TEST_FLOAT_ELEMENT, 0.0);
            promise.then((ret) => {
                expect(3.0).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name get int promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0130
         * @tc.desc get int promise interface test
         */
        it('testPreferencesGetInt0081', 0, async function (done) {
            await mPreferences.clear();
            await mPreferences.put(KEY_TEST_INT_ELEMENT, 3);
            const promise = mPreferences.get(KEY_TEST_INT_ELEMENT, 0.0);
            promise.then((ret) => {
                expect(3).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name get long promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0140
         * @tc.desc get long promise interface test
         */
        it('testPreferencesGetLong0091', 0, async function (done) {
            await mPreferences.clear();
            await mPreferences.put(KEY_TEST_LONG_ELEMENT, 3);
            const promise = mPreferences.get(KEY_TEST_LONG_ELEMENT, 0);
            promise.then((ret) => {
                expect(3).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name get String promise interface test
         * @tc.number SUB_DDM_Preferences_Get_Promise_0150
         * @tc.desc get String promise interface test
         */
        it('tesPreferencesGetString101', 0, async function (done) {
            await mPreferences.clear();
            await mPreferences.put(KEY_TEST_STRING_ELEMENT, "test");
            await mPreferences.flush();
            const promise = mPreferences.get(KEY_TEST_STRING_ELEMENT, "defaultvalue");
            promise.then((ret) => {
                expect('test').assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })

        /**
         * @tc.name put boolean promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0160
         * @tc.desc put boolean promise interface test
         */
        it('testPreferencesPutBoolean0121', 0, async function (done) {
            await mPreferences.clear();
            let promise = mPreferences.put(KEY_TEST_BOOLEAN_ELEMENT, true);
            await promise;
            let per = await mPreferences.get(KEY_TEST_BOOLEAN_ELEMENT, false);
            expect(true).assertEqual(per);
            await mPreferences.flush();
            let per2 = await mPreferences.get(KEY_TEST_BOOLEAN_ELEMENT, false);
            expect(true).assertEqual(per2);
            done();
        })

        /**
         * @tc.name put float promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0170
         * @tc.desc put float promise interface test
         */
        it('testPreferencesPutFloat0131', 0, async function (done) {
            await mPreferences.clear();
            const promise = mPreferences.put(KEY_TEST_FLOAT_ELEMENT, 4.0);
            await promise;
            let per = await mPreferences.get(KEY_TEST_FLOAT_ELEMENT, 0.0);
            expect(4.0).assertEqual(per);
            await mPreferences.flush();
            let per2 = await mPreferences.get(KEY_TEST_FLOAT_ELEMENT, 0.0);
            expect(4.0).assertEqual(per2);
            done();
        })

        /**
         * @tc.name put int promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0180
         * @tc.desc put int promise interface test
         */
        it('testPreferencesPutInt0141', 0, async function (done) {
            await mPreferences.clear();
            let promise = mPreferences.put(KEY_TEST_INT_ELEMENT, 4);
            await promise;
            let per = await mPreferences.get(KEY_TEST_INT_ELEMENT, 0);
            expect(4).assertEqual(per);
            await mPreferences.flush();
            let per2 = await mPreferences.get(KEY_TEST_INT_ELEMENT, 0);
            expect(4).assertEqual(per2);
            done();
        })

        /**
         * @tc.name put long promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0190
         * @tc.desc put long promise interface test
         */
        it('testPreferencesPutLong0151', 0, async function (done) {
            let promise = mPreferences.put(KEY_TEST_LONG_ELEMENT, 4);
            await promise;
            let per = await mPreferences.get(KEY_TEST_LONG_ELEMENT, 0);
            expect(4).assertEqual(per);
            await mPreferences.flush();
            let per2 = await mPreferences.get(KEY_TEST_LONG_ELEMENT, 0);
            expect(4).assertEqual(per2);
            done();
        })

        /**
         * @tc.name put String promise interface test
         * @tc.number SUB_DDM_Preferences_Put_Promise_0200
         * @tc.desc put String promise interface test
         */
        it('testPreferencesPutString0161', 0, async function (done) {
            let promise = mPreferences.put(KEY_TEST_STRING_ELEMENT, '');
            await promise;
            let per = await mPreferences.get(KEY_TEST_STRING_ELEMENT, "defaultvalue")
            expect('').assertEqual(per);
            await mPreferences.flush();
            let per2 = await mPreferences.get(KEY_TEST_STRING_ELEMENT, "defaultvalue")
            expect('').assertEqual(per2);
            done();
        })

        /**
         * @tc.name get string promise interface test
         * @tc.number SUB_DDM_Preferences_Get_Promise_0210
         * @tc.desc get string promise interface test
         */
        it('testPreferencesGetDefValue00162', 0, async function (done) {
            await mPreferences.clear();
            let promise = mPreferences.get(KEY_TEST_BOOLEAN_ELEMENT, true);
            promise.then((ret) => {
                expect(true).assertEqual(ret);
            }).catch((err) => {
                expect(null).assertFail();
            });
            await promise;
            done();
        })
    })
}