package com.cf.imes.module.system.enums.pay;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

/**
 * {@link DurationUnitEnum} 的单元测试
 */
public class DurationUnitEnumTest {

    @Test
    public void testFromStatus() {
        // 测试正常情况 - 年
        assertEquals(DurationUnitEnum.YEAR, DurationUnitEnum.fromStatus(0));
        
        // 测试正常情况 - 月
        assertEquals(DurationUnitEnum.MONTH, DurationUnitEnum.fromStatus(1));
        
        // 测试正常情况 - 日
        assertEquals(DurationUnitEnum.DAY, DurationUnitEnum.fromStatus(2));
        
        // 测试不存在的类型
        assertNull(DurationUnitEnum.fromStatus(999));
        
        // 测试null值
        assertNull(DurationUnitEnum.fromStatus(null));
    }

    @Test
    public void testGetDesc() {
        // 测试年描述
        assertEquals("duration.unit.year", DurationUnitEnum.getDesc(0));
        
        // 测试月描述
        assertEquals("duration.unit.month", DurationUnitEnum.getDesc(1));
        
        // 测试日描述
        assertEquals("duration.unit.day", DurationUnitEnum.getDesc(2));
        
        // 测试不存在的类型
        assertNull(DurationUnitEnum.getDesc(999));
        
        // 测试null值
        assertNull(DurationUnitEnum.getDesc(null));
    }

    @Test
    public void testEnumValues() {
        // 测试枚举值的基本属性
        assertEquals(0, DurationUnitEnum.YEAR.getCode());
        assertEquals("duration.unit.year", DurationUnitEnum.YEAR.getDesc());
        
        assertEquals(1, DurationUnitEnum.MONTH.getCode());
        assertEquals("duration.unit.month", DurationUnitEnum.MONTH.getDesc());
        
        assertEquals(2, DurationUnitEnum.DAY.getCode());
        assertEquals("duration.unit.day", DurationUnitEnum.DAY.getDesc());
    }

    @Test
    public void testArrayMethod() {
        // 测试array()方法
        int[] arrays = DurationUnitEnum.YEAR.array();
        assertEquals(3, arrays.length);
        assertTrue(contains(arrays, 0)); // YEAR
        assertTrue(contains(arrays, 1)); // MONTH
        assertTrue(contains(arrays, 2)); // DAY
    }

    @Test
    public void testArraysField() {
        // 测试ARRAYS静态字段包含所有枚举值的code
        int[] arrays = DurationUnitEnum.ARRAYS;
        assertEquals(3, arrays.length);
        assertTrue(contains(arrays, 0)); // YEAR
        assertTrue(contains(arrays, 1)); // MONTH
        assertTrue(contains(arrays, 2)); // DAY
    }

    private boolean contains(int[] array, int value) {
        for (int i : array) {
            if (i == value) {
                return true;
            }
        }
        return false;
    }
}