/*
Creat By LuoJiasi;
Plz Put in DIY File;
*/
using System.Collections.Generic;
using System.Text;
using UnityEditor;
using UnityEngine;
using System.Collections;
using System.IO;
using System;
using NUnit.Framework;
using Thousandto.Core.Base;
using Thousandto.Code.Center;
using Thousandto.Code.Logic;
using Thousandto.Core.Asset;
using CoroutinePool = UnityEngine.Gonbest.MagicCube.CoroutinePool;

namespace Funcell.DIY.UniScene
{
    public class AutoUITest : EditorWindow
    {
		[MenuItem("Ares/测试工具/自动化测试")]
        static void Init()
        {
            var win = (AutoUITest)EditorWindow.GetWindow(typeof(AutoUITest));
            win.Show();
			win.titleContent = new GUIContent("自动化测试");
        }
		#region 配置文件
		protected string _now = DateTime.Now.ToString ("yyyy-MM-dd/") + DateTime.Now.ToString ("HH:mm:ss");
		protected string _logplace;//Log存储位置
		protected int flag = 0;//测试标记:0初始,1开始,2结束		
				
		//测试结果记录到txt文件中,文件地址为_logplace
		protected void LogTest(string resultfile)
		{
			if (!File.Exists(_logplace))
			{
				File.WriteAllText(_logplace, "[Test Start]\r\n");
			}
			File.AppendAllText(_logplace, DateTime.Now.ToString ("yyyy-MM-dd/") + DateTime.Now.ToString ("HH:mm:ss") + "," + resultfile + "\r\n");
			Debug.LogWarning(resultfile);
		}
		#endregion

		private void OnGUI()
        {
			if(GUILayout.Button("自动化测试"))
			{
				_logplace = "D:/TestCase/AutoTestResult_" + DateTime.Now.ToString ("yyMMdd") + "-" + DateTime.Now.ToString ("HHmmss") + ".txt";
				CoroutinePool.AddTask(AutoFunctionUI());
			}
		}
		private IEnumerator AutoFunctionUI()
		{
			yield return new WaitForSeconds(0.1f);	
			String casepath = @"D:\\TestCase\\TestCaseList"; //用例列表的文件夹
			var casefiles = Directory.GetFiles(casepath, "*.csv");
			String tearup = @"D:\\TestCase\\SetUp.csv"; //用例初始化的文件
			String teardown = @"D:\\TestCase\\TearDown.csv"; //用例初始化的文件
			foreach (var casefile in casefiles)
			{
				LogTest("【测试用例】:" + casefile);
				string nowID = DateTime.Now.ToString ("dd") + DateTime.Now.ToString ("HHmmss");
				LogTest("测试账号:" + nowID);
				ArrayList al = new ArrayList();
				string strLine = "";
				//TearUp 准备环境				
				FileStream tearupfs = new FileStream(tearup, FileMode.Open, FileAccess.Read);
				StreamReader tearupsr = new StreamReader(tearupfs, System.Text.Encoding.GetEncoding(936));				
				strLine = tearupsr.ReadLine();
				while(strLine!=null)
				{
					al.Add(strLine);
					strLine = tearupsr.ReadLine();
				}
				//读取功能按钮的CSV文件
				FileStream casefs = new FileStream(casefile, FileMode.Open, FileAccess.Read);
				StreamReader casesr = new StreamReader(casefs, System.Text.Encoding.GetEncoding(936));
				strLine = casesr.ReadLine();
				while(strLine!=null)
				{
					al.Add(strLine);
					strLine = casesr.ReadLine();
				}
				//TearDown 环境解除
				FileStream teardownfs = new FileStream(teardown, FileMode.Open, FileAccess.Read);
				StreamReader teardownsr = new StreamReader(teardownfs, System.Text.Encoding.GetEncoding(936));
				strLine = teardownsr.ReadLine();
				while(strLine!=null)
				{
					al.Add(strLine);
					strLine = teardownsr.ReadLine();
				}
				casesr.Close();	
				tearupsr.Close();	
				teardownsr.Close();
				//String casestrline = "";
				//casestrline = casesr.ReadLine();
				//while (casestrline != null)
				//CoroutinePool.AddTask(StartStopAction(48));//每个用例前48秒会自动停止寻路,这是SetUp的时间
				foreach (string testLine in al)
				{
					LogTest(testLine);
					//StopAction();//每条用例执行前停止寻路
					List<string> list = new List<string>(testLine.Split(','));				
					//点击按钮
					if (list[0] == "ClickBtn")
					{
						if (GameObject.Find (list[1]) == null) {yield return new WaitForSeconds(3.0f);}
						ClickBtn(list[1]);
						yield return new WaitForSeconds(1.0f);
					}
					//点击有文本的按钮
					if (list[0] == "ClickBtnByName")
					{
						if (GameObject.Find (list[1]) == null) {yield return new WaitForSeconds(3.0f);}
						ClickBtnByName(list[1],list[2]);
						yield return new WaitForSeconds(1.0f);
					}
					//按序号点击按钮
					if (list[0] == "ClickBtnByIndex")
					{
						if (GameObject.Find (list[1]) == null) {yield return new WaitForSeconds(3.0f);}
						ClickBtnByIndex(list[1],list[2]);
						yield return new WaitForSeconds(1.0f);
					}
					//点击相同按钮多次
					if (list[0] == "ClickBtnTimes")
					{
						for (int i = 1; i <= int.Parse(list[2]); i++)
						{
							ClickBtn(list[1]);
							yield return new WaitForSeconds(1.0f);
						}
					}
					//发送GM命令
					if (list[0] == "SendGM")
					{
						SendGM(list[1]);
						yield return new WaitForSeconds(0.1f);
					}
					//延时等待
					if (list[0] == "Wait")
					{
						float waittime = float.Parse(list[1]);
						yield return new WaitForSeconds(waittime);
					} 
					//随机账号
					if (list[0] == "InputRA")
					{
						Input(list[1], nowID);
						LogTest("账号是:" + nowID);
					} 
					//输入文本
					if (list[0] == "Input")
					{
						Input(list[1],list[2].ToString());
						LogTest("输入的:" + list[2]);
					}
					//打开功能菜单
					if (list[0] == "OpenMenu") {OpenMenu();}
					//关闭功能菜单
					if (list[0] == "CloseMenu") {CloseMenu();}
					//断言存在控件
					if (list[0] == "Assert") {AssertGO(list[1]);} 
					//断言不存在控件
					if (list[0] == "AssertNo") {AssertNoGO(list[1]);} 
					//断言文本
					if (list[0] == "AssertText") {AssertText(list[1],list[2]);} 
					if (list[0] == "AssertActive") {AssertActiveGO(list[1]);}
					//退出-切换账号
					if (list[0] == "Quit")
					{
						GameCenter.GameSceneSystem.ReturnToLogin(true);	
						yield return new WaitForSeconds(10.0f);			
					} 
					//退出-切换角色
					if (list[0] == "Exit")
					{
						GameCenter.GameSceneSystem.ReturnToLogin(false,true);
						yield return new WaitForSeconds(10.0f);			
					} 
					//主角停止行动
					if (list[0] == "StopAction"){ StopAction();}
					//主角停止对应时间的行动
					if (list[0] == "StopActionTime") 
					{
						CoroutinePool.AddTask(StartStopAction(int.Parse(list[1])));
					} 
					//casestrline = casesr.ReadLine();
				}									
			}
			LogTest("全部用例运行完毕");
		}

		//协程,停止寻路stoptime秒
		private IEnumerator StartStopAction(int stoptime)
		{
			yield return new WaitForSeconds(0.1f); 
			for (int i = 1; i <= stoptime*10; i++)
			{
				LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
				if (lp != null && lp.IsXState(EntityStateID.PathMove))
				{
					Debug.Log ("中止寻路");
					GameCenter.MapLogicSwitch.DoPlayerExitPrepare();
				}
				yield return new WaitForSeconds(0.1f); 
			}
		}
		#region 操作
		//点击按钮
		public void ClickBtn(string file)
		{
			GameObject go = GameObject.Find (file);
			if (go == null) {
				LogTest ("【Block】,找不到:" + file);
			} else {
				UICamera.Notify(go,"OnClick",null);
			}
		}
		//点击包含Label名称为btnname的按钮,用于多个按钮有同样的名称,btnurl为按钮路径(通常有多个同路径按钮),btnname为子节点包含的label文本
        public void ClickBtnByName(string btnurl, string btnname)
        {
            GameObject go = GameObject.Find(btnurl);
			if (go == null) {
				LogTest ("【Block】,找不到:" + btnurl);
				return;
			} 
            foreach (Transform child in go.transform.parent)
            {
                foreach (UILabel child_label in child.GetComponentsInChildren<UILabel>())
                {
                    if (child_label.text.Contains(btnname))
                    {
                        UICamera.Notify(child.gameObject, "OnClick", null);
                        return;
                    }
                }
            }
        }
		//根据index点击btnurl的按钮
        public void ClickBtnByIndex(string btnurl, string btnindex)
        {
			if (GameObject.Find(btnurl))
			{
				if(GameObject.Find(btnurl).transform.parent.GetChild(int.Parse(btnindex)).gameObject)
				{
					GameObject go = GameObject.Find(btnurl).transform.parent.GetChild(int.Parse(btnindex)).gameObject;
					if (go == null)
					{
						LogTest ("【Block】,找不到:" + btnurl);
						return;
					} 
					UICamera.Notify(go, "OnClick", null);  
				}  
			}                   
        }		
		//发送GM命令
		public void SendGM(string GMString)
		{
			List<string> gmlist = new List<string>(GMString.Split(';'));
			foreach (string gm in gmlist)
			{
				MSG_Chat.ChatReqCS req = new MSG_Chat.ChatReqCS();
				req.chattype = 0;
				req.recRoleId = 0;
				req.condition = gm;
				req.chatchannel = 0;
				req.Send();
				LogTest(gm);
			}
		}
		//输入文本
		public void Input(string inputUrl,string inputString)
		{
			GameObject go = GameObject.Find(inputUrl);
			if (go == null) {
				LogTest ("【Block】,找不到:" + inputUrl);
			} 
			else {
			UIInput name = go.GetComponent<UIInput>();
			name.value = inputString;
			}
		}
		//打开菜单
		public void OpenMenu()
		{
			GameObject go = GameObject.Find("UIMainForm/RightBottom2/MenuPanel");
			if (!go) 
			{
				LogTest ("【Block】,找不到菜单按钮");
			}
			else if (!go.activeSelf)
			{
				ClickBtn("UIMainForm/RightBottom2/MenuBtn");
			} 
		}
		//关闭菜单
		public void CloseMenu()
		{
			GameObject go = GameObject.Find("UIMainForm/RightBottom2/MenuPanel");
			if (!go) 
			{
				LogTest ("【Block】,找不到菜单按钮");
			}
			else if (go.activeSelf)
			{
				ClickBtn("UIMainForm/RightBottom2/MenuBtn");
			} 
		}
		//主角停止行动
		public void StopAction()
		{
			LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
			if (lp != null)
			{
				if (lp.IsXState(EntityStateID.PathMove))
				{
					Debug.Log ("寻路中");
					GameCenter.MapLogicSwitch.DoPlayerExitPrepare();//lp.Stop_Action();
				}
			}
		}
		#endregion

		#region 断言
		//断言文本
		private void AssertText(string s1, string s2)
        {
            if (GameObject.Find(s1) != null)
            {
                UILabel ui = GameObject.Find(s1).GetComponent<UILabel>();
                if (ui != null)
                {
                    if (ui.text == s2)
                    {
                        LogTest("[Pass],在:" + s1 + "的文本是:" + s2);
                        return;
                    }
                    else if (ui.text.Contains(s2))
                    {
                        LogTest("[Pass],在:" + s1 + "包含文本:" + s2);
                        return;
                    }
                    LogTest("【Fail】," + s1 + "不存在文本:" + s2);
                }
                else
                {
                    foreach (Transform child in GameObject.Find(s1).transform.parent)
                    {
                        foreach (UILabel child_label in child.GetComponentsInChildren<UILabel>())
                        {
                            if (child_label.text.Contains(s2))
                            {
                                LogTest("[Pass],在:" + s1 + "的子路径包含文本:" + s2);
                                return;
                            }
                        }
                    }
					LogTest("【Fail】," + s1 + "不存在文本:" + s2);
                }
            }
            else
            {
                LogTest("【Block】,找不到: " + s1);
                return;
            }
        }
        //断言存在控件
        private void AssertGO(string s1)
		{
			GameObject go = GameObject.Find (s1);
			if (go == null) {
				LogTest ("【Fail】,找不到:" + s1);
			} else {
				LogTest ("[Pass],找到:" + s1);
			}	
		}
		//断言不存在控件
		private void AssertNoGO(string s1)
		{
			GameObject go = GameObject.Find (s1);
			if (go == null) {
				LogTest ("[Pass],不存在:" + s1);
			} else {
				LogTest ("【Fail】,存在不该存在的:" + s1);
			}					
		} 
		private void AssertActiveGO(string s1)
		{
			GameObject go = GameObject.Find (s1);
			if (go != null) 
			{
				if (go.activeSelf) {LogTest ("[Pass],激活的:" + s1);} 
				else {LogTest ("【Fail】,未激活的:" + s1);}
			}
			else {LogTest ("【Fail】,不存在:" + s1);}							
		} 
		#endregion
    }
}