package org.hy.common.junit;

import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hy.common.Counter;
import org.hy.common.Date;
import org.hy.common.Help;
import org.hy.common.MethodReflect;
import org.hy.common.StringHelp;
import org.junit.Assert;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;





@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class JU_Help
{
 
    @Test
    public void test_getJavaVersion()
    {
        System.out.println(Help.getJavaVersion());
    }
    
    
    
    @Test
    public void test_URI() throws URISyntaxException
    {
        URI v_URI = new URI("D:/Software/Java/jdk1.8.0_202/bin/java.exe");
        
        System.out.println(v_URI.getPath());
    }
    
    
    
    @Test
    public void test_executeCommand()
    {
        Help.print(Help.executeCommand("ls -aln /"));
        // Help.print(Help.executeCommand("ls" ,"-aln" ,"/"));
        // Help.print(Help.executeCommand("GBK" ,false ,"cmd.exe /c d: && cd D:\\apache-tomcat-7.0.47\\bin && D:\\apache-tomcat-7.0.47\\bin\\shutdown.bat"));
        // Help.print(Help.executeCommand("GBK" ,false ,"cmd.exe" ,"/c" ,"dir" ,"c:\\"));
    }
    
    
    
    @Test
    public void test_executeCommand_otherExe()
    {
        Help.print(Help.executeCommand(false ,false ,"/Volumes/HY_HD_06/Develop_HD/apache-tomcat-7.0.47/bin/startup.sh"));
        System.exit(0);
    }
    
    
    
    @SuppressWarnings({"unchecked" ,"null"})
    @Test
    public void test_toMap_BigData() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
    {
        Integer vMin = null;
        System.out.println(Math.min(0 ,vMin));
        System.out.println("--  Init: " + Date.getNowTime().getFullMilli());
        
        
        List<JU_XJSON> v_Datas = new ArrayList<JU_XJSON>();
        
        for (int i=1; i<=100000; i++)
        {
            JU_XJSON v_Data = new JU_XJSON();
            
            v_Data.setBODY(new JU_XJSON_BODYType());
            v_Data.setSID("" + i);
            v_Data.getBODY().setStaffId("" + i);
            
            v_Datas.add(v_Data);
        }
        
        
        System.out.println("-- Start: " + Date.getNowTime().getFullMilli());
     
        
        List<Map<String ,Object>> v_CollectionMap = new ArrayList<Map<String ,Object>>();
        
        for (Object v_Item : v_Datas)
        {
            Map<String ,Object> v_ItemMap = new HashMap<String ,Object>();
            
            if ( MethodReflect.isExtendImplement(v_Item ,Map.class) )
            {
                v_ItemMap.putAll((Map<String ,Object>)v_Item);
            }
            else
            {
                v_ItemMap.putAll(Help.toMap(v_Item));
            }
            
            v_CollectionMap.add(v_ItemMap);
        }
        
        System.out.println("--   End: " + Date.getNowTime().getFullMilli());
    }
    
    
    
    @Test
    public void test_toLike()
    {
        String []      v_Arrs  = new String[100];
        List<String>   v_Strs  = new ArrayList<String>();
        List<JU_XJSON> v_Datas = new ArrayList<JU_XJSON>();
        
        for (int i=1; i<=100; i++)
        {
            JU_XJSON v_Data = new JU_XJSON();
            
            v_Data.setBODY(new JU_XJSON_BODYType());
            v_Data.setSID("" + i);
            v_Data.getBODY().setStaffId("" + i);
            
            v_Datas.add(v_Data);
            v_Strs .add("" + i);
            v_Arrs[i - 1] = "" + i;
        }
        
        System.out.println("List对象xx.yy.zz测试");
        Help.print(Help.toLike(v_Datas ,"body.staffid" ,true ,"1"));
        
        System.out.println("List对象直属属性测试");
        Help.print(Help.toLike(v_Datas ,"sid" ,true ,"1" ,"2"));
        
        System.out.println("List简单类型集合测试");
        Help.print(Help.toLike(v_Strs ,true ,"0" ,"2"));
        
        System.out.println("数组简单类型测试");
        Help.print(Help.toLike(v_Arrs ,true ,"3" ,"1"));
    }
    
    
    
    @Test
    public void test_round()
    {
        System.out.println(Help.round(0.00005123 ,4));
    }
    
    
    
    @Test
    public void test_getMacs()
    {
        System.out.println(Help.getMacs());
    }
    
    
    
    @Test
    public void test_findSames()
    {
        List<String> v_Datas = new ArrayList<String>();
        List<String> v_Sames = null;
        
        for (int i=0; i<10; i++)
        {
            v_Datas.add("" + i);
        }
        
        // 生成重复的数据
        for (int i=0; i<3; i++)
        {
            v_Datas.add("" + i);
        }
        
        // 再生成第二次重复的数据
        for (int i=0; i<3; i++)
        {
            v_Datas.add("" + i);
        }
        
        v_Sames = Help.findSames(v_Datas);
        
        System.out.println("\n-- 查找重复的元素");
        Help.print(v_Sames);
        
        Assert.assertTrue(v_Sames.size() == 3);
    }
    
    
    
    @Test
    public void test_subtract()
    {
        double v_Ret01 = Help.subtract("60.3" ,"60.01");
        double v_Ret02 = Help.subtract(60.3   ,60.01);
        
        System.out.println("减法的差值不等于0.29:" + (60.3 - 60.01));
        
        Assert.assertTrue("减法的差值是否相等" ,v_Ret01 == 0.29);
        Assert.assertTrue("减法的差值是否相等" ,v_Ret02 == 0.29);
    }
    
    

    @Test
    public void test_division()
    {
        double v_Ret01 = Help.division("1" ,"3");
        double v_Ret02 = Help.division(1   ,3);
        
        System.out.println("除法的差值不等于0.333333333:" + (1.0 / 3.0));
        
        Assert.assertTrue("减法的差值是否相等" ,v_Ret01 == 0.333333333);
        Assert.assertTrue("减法的差值是否相等" ,v_Ret02 == 0.333333333);
    }
    
    
    
    @Test
    public void test_toMap() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
    {
        System.out.println("-- 排序返回");
        Help.print(Help.toMap(new JU_XJSON()));
        
        System.out.println("\n-- 随机返回");
        Help.print(Help.toMap(new JU_XJSON() ,null ,true ,false));
        
        System.out.println("2015/09/29".replaceAll("/" ,"-"));
    }
    
    
    
    @Test
    public void test_toSortByNum()
    {
        System.out.println("\n\n正序排序。不改变数据格式");
        Help.print(Help.toSortByNum("3.1" ,"3.0" ,"3.010"));
        
        System.out.println("\n\n倒序排序。不改变数据格式");
        Help.print(Help.toReverseByNum("3.1" ,"3.0" ,"3.010"));
    }
    
    
    
    @Test
    public void test_toSort()
    {
        List<JU_XJSON> v_Datas = new ArrayList<JU_XJSON>();
        
        v_Datas.add(new JU_XJSON("00" ,"1"   ,1));
        v_Datas.add(new JU_XJSON("01" ,"10"  ,2));
        v_Datas.add(new JU_XJSON("02" ,"11"  ,3));
        v_Datas.add(new JU_XJSON("00" ,"111" ,4));
        v_Datas.add(new JU_XJSON("03" ,"2"   ,5));
        
        System.out.println("\n\n按SID倒序排序");
        Help.toSort(v_Datas ,"SID Desc" ,"BODY.hyDate Desc");
        Help.print(v_Datas);
        
        System.out.println("\n\n按SID正序排序");
        Help.toSort(v_Datas ,"SID");
        Help.print(v_Datas);
        
        System.out.println("\n\n按SID倒序、SIGN倒排序");
        Help.toSort(v_Datas ,"SID Desc" ,"SIGN Desc");
        Help.print(v_Datas);
        
        System.out.println("\n\n按SID倒序、SIGN正排序");
        Help.toSort(v_Datas ,"SID Desc" ,"SIGN");
        Help.print(v_Datas);
        
        System.out.println("\n\n按SID倒序、时间倒排序");
        Help.toSort(v_Datas ,"SID Desc" ,"REQTIME Desc");
        Help.print(v_Datas);
        
        System.out.println("\n\n按doubleValue倒序排序");
        Help.toSort(v_Datas ,"doubleValue Desc");
        Help.print(v_Datas);
        
        System.out.println("\n\n按SIGN数字倒排序");
        Help.toSort(v_Datas ,"SIGN NumDesc");
        Help.print(v_Datas);
        
        System.out.println("\n\n按SIGN数字正排序");
        Help.toSort(v_Datas ,"SIGN NumAsc");
        Help.print(v_Datas);
        
        System.out.println("\n\n按SIGN正排序");
        Help.toSort(v_Datas ,"SIGN Asc");
        Help.print(v_Datas);
        
        System.out.println("\n\n按SIGN倒排序。并有错误排序属性名的情况下");
        Help.toSort(v_Datas ,"2015 Desc" ,"SIGN Desc" ,"2016 Asc");
        Help.print(v_Datas);
    }
    
    
    
    @Test
    public void test_toSortByMap()
    {
        Counter<String> v_Counter = new Counter<String>();
        String []       v_ABC     = {"A" ,"B" ,"C" ,"D" ,"E" ,"F" ,"G" ,"H" ,"I" ,"J" ,"K" ,"M" ,"N"};
        
        for (int i=0; i<10; i++)
        {
            v_Counter.put(v_ABC[i] ,Help.random(10));
        }
        
        System.out.println("-- 正排序Map.value");
        Help.print(Help.toSortByMap(   v_Counter));
        
        System.out.println("\n-- 倒排序Map.value");
        Help.print(Help.toReverseByMap(v_Counter));
    }
    
    
    
    public void test_toList()
    {
        List<JU_XJSON> v_Datas = new ArrayList<JU_XJSON>();
        
        v_Datas.add(new JU_XJSON("00" ,"1"   ,1));
        v_Datas.add(new JU_XJSON("01" ,"10"  ,2));
        v_Datas.add(new JU_XJSON("02" ,"11"  ,3));
        
        System.out.println("\n\n按SID列抽取");
        Help.print(Help.toList(v_Datas ,"SID"));
        
        System.out.println("\n\n按doubleValue列抽取");
        Help.print(Help.toList(v_Datas ,"doubleValue"));
    }
    
    
    
    public void test_replaceAll()
    {
        System.out.println("A'B".replaceAll("'" ,"''"));
        System.out.println(StringHelp.replaceAll("AAA.BBB.CC"   ,"AAA" + "."  ,"HY"));
        
        
        String v_Info = "\"electricConn\": \"NPT1/2\\\"\"";
        //System.out.println(v_Info + " = " + StringHelp.replaceAll(v_Info ,"\\\"" ,"\""));
        System.out.println(v_Info + " = " + StringHelp.replaceAll(StringHelp.replaceAll(v_Info ,"\\\"" ,"\"") ,"\"" ,"\\\""));
        
        System.out.println(StringHelp.replaceAll("AAA"   ,"A"  ,"B"));
        System.out.println(StringHelp.replaceAll("Q\"Q"  ,"\"" ,""));
        System.out.println(StringHelp.replaceAll("Q美元Q" ,"美元" ,"$"));
        System.out.println(StringHelp.replaceAll("Q美元Q" ,"美元" ,""));
        System.out.println(StringHelp.replaceAll("Q美元Q" ,"" ,"$"));
        System.out.println(StringHelp.replaceAll("ABC" ,new String[]{"A" ,"B" ,"C"} ,new String[]{" "}));
        System.out.println(StringHelp.replaceAll("package com.fms.template.dao.impl;" ,new String[]{"template" ,"Template"} ,new String[]{"person" ,"Person"}));
    }
    
    
    
    public void test_toDistinct()
    {
        List<JU_XJSON> v_Datas = new ArrayList<JU_XJSON>();
        
        v_Datas.add(new JU_XJSON("00" ,"1"   ,1));
        v_Datas.add(new JU_XJSON("01" ,"10"  ,2));
        v_Datas.add(new JU_XJSON("02" ,"11"  ,3));
        v_Datas.add(new JU_XJSON("00" ,"111" ,4));
        v_Datas.add(new JU_XJSON("03" ,"2"   ,5));
        
        System.out.println("\n\n重除显示");
        Help.toDistinct(v_Datas ,"SID");
        Help.print(v_Datas);
    }
    
    
    
    /**
     * 测试数据排序
     * 
     * @author      ZhengWei(HY)
     * @createDate  2016-02-20
     * @version     v1.0
     *
     */
    public void test_SortArray()
    {
        System.out.println("-- 测试元素个数为偶数的倒序排序");
        Help.print(Help.toReverse(new int[]{1 ,2 ,3 ,4}));
        
        System.out.println("-- 测试元素个数为奇数的倒序排序");
        Help.print(Help.toReverse(new int[]{1 ,2 ,3}));
    }
    
    
    
    @Test
    public void test_getClasses()
    {
        List<Class<?>> v_Ret = Help.getClasses("org.hy.common.一个不存在包名");
        
        Help.print(v_Ret);
    }
    
    
    
    @Test
    public void test_getUUIDLong()
    {
        System.out.println(StringHelp.getUUIDNum());
    }
    
}