#!/bin/bash

NUM_OF_DI=""
NUM_OF_DO=""
NUM_OF_DIO_STATE=2
FILE_PATH="/usr/sbin/mx-interface-mgmt"

function test_pass_result {
        if [ $1 -eq 0 ]; then
                echo -e "[\e[32mPASS\e[0m] $2"
        else
                echo -e "[\e[31mFAIL\e[0m] $2"
        fi
}

function test_fail_result {
        if [ $1 -eq 0 ]; then
                echo -e "[\e[31mFAIL\e[0m] $2"
        else
                echo -e "[\e[32mPASS\e[0m] $2"
        fi
}

if [[ $# -ne 2 ]]; then
        echo "test_wrapper_dio <num_of_di> <num_of_do>"
        exit 1
fi

NUM_OF_DI=$1
NUM_OF_DO=$2

# Test 1: Check if tool is installed
test -e $FILE_PATH
test_pass_result $? "Test 1: Check if tool is installed"

# check if device is support dio
result=$(bash $FILE_PATH dio)
if [ "$result" == "Error: Don't support dio" ]; then
        echo "This device don't support dio"
        exit 1
fi

# Test 2: Invalid DIO Port format 1
bash $FILE_PATH dio 00 get_state >/dev/null 2>&1
test_fail_result $? "Test 2: Invalid DIO Port format 1"

# Test 3: Invalid DIO Port format 2
bash $FILE_PATH dio abc get_state >/dev/null 2>&1
test_fail_result $? "Test 3: Invalid DIO Port format 2"

# Test 4: Invalid DI Port format 1
bash $FILE_PATH dio DI00 get_state >/dev/null 2>&1
test_fail_result $? "Test 4: Invalid DI Port format 1"

# Test 5: Invalid DI Port format 2
bash $FILE_PATH dio DIabc get_state >/dev/null 2>&1
test_fail_result $? "Test 5: Invalid DI Port format 2"

# Test 6: Invalid DI Port
bash $FILE_PATH dio DI$NUM_OF_DI get_state >/dev/null 2>&1
test_fail_result $? "Test 6: Invalid DI Port"

# Test 7: Invalid DO Port format 1
bash $FILE_PATH dio DO00 get_state >/dev/null 2>&1
test_fail_result $? "Test 7: Invalid DO Port format 1"

# Test 8: Invalid DO Port format 2
bash $FILE_PATH dio DOabc get_state >/dev/null 2>&1
test_fail_result $? "Test 8: Invalid DO Port format 2"

# Test 9: Invalid DO Port
bash $FILE_PATH dio DO$NUM_OF_DO get_state >/dev/null 2>&1
test_fail_result $? "Test 9: Invalid DO Port"

# Test 10: Invalid DO Port and State format 1
bash $FILE_PATH dio DO00 set_state 01 >/dev/null 2>&1
test_fail_result $? "Test 10: Invalid DO Port and State format 1"

# Test 11: Invalid DO Port and State format 2
bash $FILE_PATH dio DOabc set_state def >/dev/null 2>&1
test_fail_result $? "Test 11: Invalid DO Port and State format 2"

# Test 12: Invalid DO State format 1
bash $FILE_PATH dio DO0 set_state 01 >/dev/null 2>&1
test_fail_result $? "Test 12: Invalid DO State format 1"

# Test 13: Invalid DO State format 2
bash $FILE_PATH dio DO0 set_state ab >/dev/null 2>&1
test_fail_result $? "Test 13: Invalid DO State format 2"

# Test 14: Invalid DO State
bash $FILE_PATH dio DO0 set_state $NUM_OF_DIO_STATE >/dev/null 2>&1
test_fail_result $? "Test 14: Invalid DO State"

# Test 15: Pass DI and State parameter
bash $FILE_PATH dio DI0 set_state 0 >/dev/null 2>&1
test_fail_result $? "Test 15: Pass DI and State parameter"

# Test 16: Get All DI port State
for ((i = 0; i < $NUM_OF_DI; ++i)); do
        result=$(bash $FILE_PATH dio DI$i get_state)
        test_pass_result $(
                [[ "$result" == "low" ]] ||
                        [[ "$result" == "high" ]]
                echo $?
        ) "Test 16: Get DI port $i State"
done

# Test 17: Get All DO port State
for ((i = 0; i < $NUM_OF_DO; ++i)); do
        result=$(bash $FILE_PATH dio DO$i get_state)
        test_pass_result $(
                [[ "$result" == "low" ]] ||
                        [[ "$result" == "high" ]]
                echo $?
        ) "Test 17: Get DO port $i State"
done

# Test 18: Set All DO port low State
for ((i = 0; i < $NUM_OF_DO; ++i)); do
        bash $FILE_PATH dio DO$i set_state 0 >/dev/null 2>&1
        if [[ $? -ne 0 ]]; then
                test_pass_result 1 "Test 18: Set DO port $i low State"
                continue
        fi

        result=$(bash $FILE_PATH dio DO$i get_state)
        test_pass_result $(
                [[ "$result" == "low" ]]
                echo $?
        ) "Test 18: Set DO port $i low State"
done

# Test 19: Set All DO port high State
for ((i = 0; i < $NUM_OF_DO; ++i)); do
        bash $FILE_PATH dio DO$i set_state 1 >/dev/null 2>&1
        if [[ $? -ne 0 ]]; then
                test_pass_result 1 "Test 19: Set DO port $i high State"
                continue
        fi

        result=$(bash $FILE_PATH dio DO$i get_state)
        test_pass_result $(
                [[ "$result" == "high" ]]
                echo $?
        ) "Test 19: Set DO port $i high State"
done

# Test 20: Loopback test - Set DO port low State and Get DI port
for ((i = 0; i < $NUM_OF_DO; ++i)); do
        bash $FILE_PATH dio DO$i set_state 0 >/dev/null 2>&1
        if [[ $? -ne 0 ]]; then
                test_pass_result 1 "Test 20: Loopback test - Set DO port $i low State and Get DI port $i"
                continue
        fi

        result=$(bash $FILE_PATH dio DI$i get_state)
        test_pass_result $(
                [[ "$result" == "low" ]]
                echo $?
        ) "Test 20: Loopback test - Set DO port $i low State and Get DI port $i"
done

# Test 21: Loopback test - Set high
for ((i = 0; i < $NUM_OF_DO; ++i)); do
        bash $FILE_PATH dio DO$i set_state 1 >/dev/null 2>&1
        if [[ $? -ne 0 ]]; then
                test_pass_result 1 "Test 21: Loopback test - Set DO port $i high State and Get DI port $i"
                continue
        fi

        result=$(bash $FILE_PATH dio DO$i get_state)
        test_pass_result $(
                [[ "$result" == "high" ]]
                echo $?
        ) "Test 21: Loopback test - Set DO port $i high State and Get DI port $i"
done
