-- Copyright (c) 2026 Huawei Technologies Co., Ltd.
-- openUBMC is licensed under Mulan PSL v2.
-- You can use this software according to the terms and conditions of the Mulan PSL v2.
-- You may obtain a copy of Mulan PSL v2 at:
-- http://license.coscl.org.cn/MulanPSL2
-- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
-- EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
-- MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
-- See the Mulan PSL v2 for more details.

local lu = require('luaunit')
local argparse = require('argparse')

TestParser = {}

function TestParser:setupClass() end

function TestParser:teardownClass() end

function TestParser:test_cli_parse_params()
    local argument_parser = argparse.ArgumentParser('test argument parser')
    argument_parser:add_argument('-s', { default = { '1' }, nargs = '+', help = 'system_id', required = true })
    argument_parser:add_argument('-l', { default = { '2' }, nargs = '+', help = 'board_id', required = true })
    argument_parser:add_argument('-v', { default = { '3' }, nargs = '+', help = 'extra_param', required = true })

    local test_cli_params = { '-s', '2', '-l', 'blade1', '-v', 'clear' }
    local params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = { '2' }, ['-l'] = { 'blade1' }, ['-v'] = { 'clear' } })
    lu.assertEquals(value_err, false)

    test_cli_params = { '-x', 'cccc' }
    params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = { '1' }, ['-l'] = { '2' }, ['-v'] = { '3' } })
    lu.assertEquals(value_err, true)
end

function TestParser:test_cli_parse_params_nargs()
    local argument_parser = argparse.ArgumentParser('test argument parser')
    argument_parser:add_argument('-s', { default = { '1' }, nargs = '?', help = 'system_id', required = true })
    argument_parser:add_argument('-l', { default = { '1' }, nargs = '?', help = 'board_id', required = true })
    argument_parser:add_argument('-v', { default = { '1' }, nargs = '*', help = 'extra_param', required = true })

    local test_cli_params = { '-s', '11', '-l', 'aaa', '-v', '0', '1' }
    local params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = { '11' }, ['-l'] = { 'aaa' }, ['-v'] = { '0', '1' } })
    lu.assertEquals(value_err, false)

    test_cli_params = { '-s', '12', '-l', 'bs', '-v', 'enabled', '-xxxx' }
    params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = { '12' }, ['-l'] = { 'bs' }, ['-v'] = { 'enabled', '-xxxx' } })
    lu.assertEquals(value_err, false)

    test_cli_params = { '-s', '-l', '-v' }
    params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = { '1' }, ['-l'] = { '1' }, ['-v'] = { '1' } })
    lu.assertEquals(value_err, false)

    test_cli_params = { '-s', '1', '3', '7', '-l', '-v' }
    params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = { '1', '3', '7' } })
    lu.assertEquals(value_err, true)

    test_cli_params = { '-s', '-l', '1', '3', '7', '-v' }
    params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = { '1' }, ['-l'] = { '1', '3', '7' } })
    lu.assertEquals(value_err, true)
end

function TestParser:test_cli_parse_params_required()
    local argument_parser = argparse.ArgumentParser('test argument parser')
    argument_parser:add_argument('-a', { nargs = '+', help = 'testaaa', required = true })
    argument_parser:add_argument('-t', { default = { 'sensor' }, nargs = '+', help = 'testttt', required = true })

    local test_cli_params = { '-a', 'testing' }
    local params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-a'] = { 'testing' }, ['-t'] = { 'sensor' } })
    lu.assertEquals(value_err, false)

    test_cli_params = { '-t', 'cccc' }
    params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-a'] = {} })
    lu.assertEquals(value_err, true)
end

function TestParser:test_cli_parse_timezone()
    local argument_parser = argparse.ArgumentParser('test argument parser')
    argument_parser:add_argument('-s', { nargs = '?', help = 'system_id' })
    argument_parser:add_argument('-v', { nargs = '*', help = 'extra_param' })

    local test_cli_params = { '-v', '-11:00' }
    local params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = {}, ['-v'] = { '-11:00' } })
    lu.assertEquals(value_err, false)

    local test_cli_params = { '-v', 'UTC-4:30' }
    local params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = {}, ['-v'] = { 'UTC-4:30' } })
    lu.assertEquals(value_err, false)

    test_cli_params = { '-s', '24', '-v', '+8:00' }
    params_tuple, value_err = argument_parser:parse_args(test_cli_params)

    lu.assertEquals(params_tuple, { ['-s'] = { '24' }, ['-v'] = { '+8:00' } })
    lu.assertEquals(value_err, false)
end