An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.6 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
namespace UnityTest
{
public abstract class ActionBase : ScriptableObject
{
public GameObject go;
protected object m_ObjVal;
private MemberResolver m_MemberResolver;
public string thisPropertyPath = "";
public virtual Type[] GetAccepatbleTypesForA()
{
return null;
}
public virtual int GetDepthOfSearch() { return 2; }
public virtual string[] GetExcludedFieldNames()
{
return new string[] { };
}
public bool Compare()
{
if (m_MemberResolver == null)
m_MemberResolver = new MemberResolver(go, thisPropertyPath);
m_ObjVal = m_MemberResolver.GetValue(UseCache);
var result = Compare(m_ObjVal);
return result;
}
protected abstract bool Compare(object objVal);
virtual protected bool UseCache { get { return false; } }
public virtual Type GetParameterType() { return typeof(object); }
public virtual string GetConfigurationDescription()
{
string result = "";
#if !UNITY_METRO
foreach (var prop in GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.Where(info => info.FieldType.IsSerializable))
{
var value = prop.GetValue(this);
if (value is double)
value = ((double)value).ToString("0.########");
if (value is float)
value = ((float)value).ToString("0.########");
result += value + " ";
}
#endif // if !UNITY_METRO
return result;
}
IEnumerable<FieldInfo> GetFields(Type type)
{
#if !UNITY_METRO
return type.GetFields(BindingFlags.Public | BindingFlags.Instance);
#else
return null;
#endif
}
public ActionBase CreateCopy(GameObject oldGameObject, GameObject newGameObject)
{
#if !UNITY_METRO
var newObj = CreateInstance(GetType()) as ActionBase;
#else
var newObj = (ActionBase) this.MemberwiseClone();
#endif
var fields = GetFields(GetType());
foreach (var field in fields)
{
var value = field.GetValue(this);
if (value is GameObject)
{
if (value as GameObject == oldGameObject)
value = newGameObject;
}
field.SetValue(newObj, value);
}
return newObj;
}
public virtual void Fail(AssertionComponent assertion)
{
Debug.LogException(new AssertionException(assertion), assertion.GetFailureReferenceObject());
}
public virtual string GetFailureMessage()
{
return GetType().Name + " assertion failed.\n(" + go + ")." + thisPropertyPath + " failed. Value: " + m_ObjVal;
}
}
public abstract class ActionBaseGeneric<T> : ActionBase
{
protected override bool Compare(object objVal)
{
return Compare((T)objVal);
}
protected abstract bool Compare(T objVal);
public override Type[] GetAccepatbleTypesForA()
{
return new[] { typeof(T) };
}
public override Type GetParameterType()
{
return typeof(T);
}
protected override bool UseCache { get { return true; } }
}
}