/*******************************************************************************
* Copyright 2019-2021 Intel Corporation
*
* 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.
*******************************************************************************/

#define EPS 1e-5f

#define EXPAND_FORMATS(data, stat, diff) \
    memory::format_tag::data, memory::format_tag::stat, memory::format_tag::diff

#define PARAMS_NC(...) \
    test_lnorm_params_t { \
        EXPAND_FORMATS(ab, a, ab), __VA_ARGS__, EPS, false, dnnl_success \
    }

#define PARAMS_TNC(...) \
    test_lnorm_params_t { \
        EXPAND_FORMATS(abc, ab, abc), __VA_ARGS__, EPS, false, dnnl_success \
    }

#define PARAMS_TNC_CROSS_CASE(...) \
    test_lnorm_params_t { \
        EXPAND_FORMATS(abc, ba, abc), __VA_ARGS__, EPS, false, dnnl_success \
    }

#define PARAMS_NTC(...) \
    test_lnorm_params_t { \
        EXPAND_FORMATS(bac, ba, bac), __VA_ARGS__, EPS, false, dnnl_success \
    }

#define PARAMS_LDSNC(...) \
    test_lnorm_params_t { \
        EXPAND_FORMATS(abcde, abcd, abcde), __VA_ARGS__, EPS, false, \
                dnnl_success \
    }

#define PARAMS_LDSNC_CROSS_CASE(...) \
    test_lnorm_params_t { \
        EXPAND_FORMATS(abcde, acdb, abcde), __VA_ARGS__, EPS, false, \
                dnnl_success \
    }

#define PARAMS_EF(...) \
    test_lnorm_params_t { EXPAND_FORMATS(abc, ab, abc), __VA_ARGS__ }

#define PARAMS_ANY_EF(...) \
    test_lnorm_params_t { EXPAND_FORMATS(any, ab, abc), __VA_ARGS__ }

#define CPU_INST_TEST_CASE(str, ...) \
    CPU_INSTANTIATE_TEST_SUITE_P( \
            str, lnorm_test_t, ::testing::Values(__VA_ARGS__));

CPU_INST_TEST_CASE(SimpleExpectedFails,
        PARAMS_EF({-1, 27, 9}, EPS, true, dnnl_invalid_arguments),
        PARAMS_EF({1, -12, 10}, EPS, true, dnnl_invalid_arguments),
        PARAMS_EF({4, 20, -12}, EPS, true, dnnl_invalid_arguments),
        PARAMS_ANY_EF({6, 32, 8}, EPS, true, dnnl_invalid_arguments));

CPU_INST_TEST_CASE(SimpleZeroDim, PARAMS_NC({0, 9}), PARAMS_NC({1, 0}));

CPU_INST_TEST_CASE(
        Simple_NC, PARAMS_NC({1, 100}), PARAMS_NC({20, 8}), PARAMS_NC({2, 10}));

CPU_INST_TEST_CASE(Simple_TNC, PARAMS_TNC({6, 32, 8}), PARAMS_TNC({2, 10, 4}),
        PARAMS_TNC({2, 8, 16}));

CPU_INST_TEST_CASE(CrossCase_TNC, PARAMS_TNC_CROSS_CASE({6, 32, 8}),
        PARAMS_TNC_CROSS_CASE({2, 10, 4}), PARAMS_TNC_CROSS_CASE({2, 8, 16}));

CPU_INST_TEST_CASE(Simple_NTC, PARAMS_TNC({64, 32, 8}), PARAMS_TNC({32, 10, 4}),
        PARAMS_TNC({12, 8, 16}));

CPU_INST_TEST_CASE(Simple_LDSNC, PARAMS_LDSNC({6, 2, 2, 32, 8}),
        PARAMS_LDSNC({2, 2, 2, 10, 4}), PARAMS_LDSNC({2, 2, 2, 8, 16}));

CPU_INST_TEST_CASE(CrossCase_LDSNC, PARAMS_LDSNC_CROSS_CASE({6, 2, 2, 32, 8}),
        PARAMS_LDSNC_CROSS_CASE({2, 2, 2, 10, 4}),
        PARAMS_LDSNC_CROSS_CASE({2, 2, 2, 8, 16}));
