您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
145 行
3.5 KiB
145 行
3.5 KiB
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.RMGUI;
|
|
using UnityEngine.PlaymodeTests;
|
|
using UnityEngine.Assertions;
|
|
using UnityEditor;
|
|
using System.Collections;
|
|
|
|
[EditModeTest]
|
|
public class DataWatchTests
|
|
{
|
|
class MyWindow : EditorWindow
|
|
{
|
|
}
|
|
|
|
class MyData : ScriptableObject
|
|
{
|
|
public int myField;
|
|
}
|
|
|
|
int m_Calls;
|
|
MyData data;
|
|
DataWatchService watch;
|
|
|
|
public DataWatchTests()
|
|
{
|
|
data = ScriptableObject.CreateInstance<MyData>();
|
|
watch = new DataWatchService();
|
|
}
|
|
|
|
void OnDataChanged()
|
|
{
|
|
m_Calls++;
|
|
}
|
|
|
|
[EditModeTest]
|
|
public IEnumerator DataWatchCallsOnChanged()
|
|
{
|
|
var window = EditorWindow.GetWindow<MyWindow>();
|
|
|
|
IDataWatchHandle handle = watch.AddWatch(window.rootVisualContainer, data, OnDataChanged);
|
|
Assert.IsTrue(watch.IsActive(handle), "Expected watch to be active");
|
|
|
|
data.myField = 1;
|
|
watch.ProcessNotificationQueue();
|
|
Assert.AreEqual(m_Calls, 1, "Expected first call after change");
|
|
|
|
watch.ProcessNotificationQueue();
|
|
Assert.AreEqual(m_Calls, 1, "Expected no new call after no change");
|
|
|
|
data.myField = 1;
|
|
watch.ProcessNotificationQueue();
|
|
Assert.AreEqual(m_Calls, 1, "Expected no new call after idempotent change");
|
|
|
|
data.myField = 2;
|
|
watch.ProcessNotificationQueue();
|
|
Assert.AreEqual(m_Calls, 2, "Expect second callback after change");
|
|
|
|
handle.Dispose();
|
|
window.Close();
|
|
yield return null;
|
|
}
|
|
|
|
[EditModeTest]
|
|
public IEnumerator DataWatchCallsOnChangedForDestroyedObject() {
|
|
|
|
var window = EditorWindow.GetWindow<MyWindow>();
|
|
|
|
yield return null;
|
|
|
|
IDataWatchHandle handle = watch.AddWatch(window.rootVisualContainer, data, OnDataChanged);
|
|
|
|
ScriptableObject.DestroyImmediate(data);
|
|
Assert.IsTrue(watch.IsActive(handle), "Expected watch to still be active after destruction");
|
|
watch.ProcessNotificationQueue();
|
|
Assert.AreEqual(m_Calls, 1, "Expect a call after destruction");
|
|
|
|
window.Close();
|
|
yield return null;
|
|
}
|
|
|
|
[EditModeTest]
|
|
public IEnumerator CanStopWatchingObject()
|
|
{
|
|
var window = EditorWindow.GetWindow<MyWindow>();
|
|
|
|
IDataWatchHandle handle = watch.AddWatch(window.rootVisualContainer, data, OnDataChanged);
|
|
|
|
handle.Dispose();
|
|
Assert.IsFalse(watch.IsActive(handle), "Expected watch to not be active after removal");
|
|
|
|
data.myField = 1;
|
|
|
|
Assert.AreEqual(m_Calls, 0, "Expected no call after removing watch");
|
|
|
|
window.Close();
|
|
yield return null;
|
|
}
|
|
|
|
[EditModeTest]
|
|
public IEnumerator CanStopWatchingObjectDuringCallback()
|
|
{
|
|
IDataWatchHandle handle = null;
|
|
var window = EditorWindow.GetWindow<MyWindow>();
|
|
|
|
Action removeOnCall = () => handle.Dispose();
|
|
|
|
handle = watch.AddWatch(window.rootVisualContainer, data, removeOnCall);
|
|
|
|
data.myField = 1;
|
|
watch.ProcessNotificationQueue();
|
|
|
|
Assert.IsFalse(watch.IsActive(handle), "Expected watch to not be active after removal");
|
|
|
|
window.Close();
|
|
yield return null;
|
|
}
|
|
|
|
[EditModeTest]
|
|
public IEnumerator ReceivesCallbackForUndo()
|
|
{
|
|
var window = EditorWindow.GetWindow<MyWindow>();
|
|
IDataWatchHandle handle = watch.AddWatch(window.rootVisualContainer, data, OnDataChanged);
|
|
|
|
Undo.RecordObject(data, "change");
|
|
data.myField = 1;
|
|
yield return null;
|
|
watch.ProcessNotificationQueue();
|
|
Assert.AreEqual(m_Calls, 1, "Expected first call after change");
|
|
|
|
Undo.PerformUndo();
|
|
yield return null;
|
|
watch.ProcessNotificationQueue();
|
|
Assert.AreEqual(m_Calls, 2, "Expected second call after undo");
|
|
|
|
Undo.PerformRedo();
|
|
yield return null;
|
|
watch.ProcessNotificationQueue();
|
|
Assert.AreEqual(m_Calls, 3, "Expected third call after redo");
|
|
|
|
handle.Dispose();
|
|
window.Close();
|
|
yield return null;
|
|
}
|
|
}
|