SettingsTests.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. using UnityEngine;
  2. using System;
  3. using System.IO;
  4. using NUnit.Framework;
  5. using UnityEditor;
  6. using UnityEditor.SettingsManagement;
  7. using UnityEngine.TestTools;
  8. namespace UnityEngine.SettingsManagement.EditorTests
  9. {
  10. class SettingsTests : IPrebuildSetup, IPostBuildCleanup
  11. {
  12. const string k_PackageName = "com.unity.settings-manager";
  13. const string k_SettingsFile = "SettingsTests";
  14. static Settings s_Settings;
  15. static string projectSettingsPath
  16. {
  17. get { return PackageSettingsRepository.GetSettingsPath(k_PackageName, k_SettingsFile); }
  18. }
  19. static Settings settings
  20. {
  21. get
  22. {
  23. if (s_Settings == null)
  24. s_Settings = new Settings(k_PackageName);
  25. return s_Settings;
  26. }
  27. }
  28. public void Setup()
  29. {
  30. }
  31. public void Cleanup()
  32. {
  33. foreach (var v in s_AllPreferences)
  34. v.Delete();
  35. if (File.Exists(projectSettingsPath))
  36. File.Delete(projectSettingsPath);
  37. }
  38. [Serializable]
  39. struct DummyStruct : IEquatable<DummyStruct>
  40. {
  41. public string stringValue;
  42. public int intValue;
  43. public DummyStruct(string s, int i)
  44. {
  45. stringValue = s;
  46. intValue = i;
  47. }
  48. public static DummyStruct defaultValue
  49. {
  50. get { return new DummyStruct("I'm a string!", 42); }
  51. }
  52. public bool Equals(DummyStruct other)
  53. {
  54. return string.Equals(stringValue, other.stringValue) && intValue == other.intValue;
  55. }
  56. public override bool Equals(object obj)
  57. {
  58. if (ReferenceEquals(null, obj))
  59. return false;
  60. return obj is DummyStruct && Equals((DummyStruct)obj);
  61. }
  62. public override int GetHashCode()
  63. {
  64. unchecked
  65. {
  66. return ((stringValue != null ? stringValue.GetHashCode() : 0) * 397) ^ intValue;
  67. }
  68. }
  69. public static bool operator ==(DummyStruct left, DummyStruct right)
  70. {
  71. return left.Equals(right);
  72. }
  73. public static bool operator !=(DummyStruct left, DummyStruct right)
  74. {
  75. return !left.Equals(right);
  76. }
  77. public override string ToString()
  78. {
  79. return stringValue + " " + intValue;
  80. }
  81. }
  82. [Serializable]
  83. class DummyClass : IEquatable<DummyClass>
  84. {
  85. public string stringValue;
  86. public int intValue;
  87. public DummyClass(string s, int i)
  88. {
  89. stringValue = s;
  90. intValue = i;
  91. }
  92. public static DummyClass defaultValue
  93. {
  94. get { return new DummyClass("I'm a string!", 42); }
  95. }
  96. public bool Equals(DummyClass other)
  97. {
  98. return string.Equals(stringValue, other.stringValue) && intValue == other.intValue;
  99. }
  100. public override bool Equals(object obj)
  101. {
  102. if (ReferenceEquals(null, obj))
  103. return false;
  104. return obj is DummyClass && Equals((DummyClass)obj);
  105. }
  106. public override int GetHashCode()
  107. {
  108. unchecked
  109. {
  110. return ((stringValue != null ? stringValue.GetHashCode() : 0) * 397) ^ intValue;
  111. }
  112. }
  113. public static bool operator ==(DummyClass left, DummyClass right)
  114. {
  115. return left.Equals(right);
  116. }
  117. public static bool operator !=(DummyClass left, DummyClass right)
  118. {
  119. return !left.Equals(right);
  120. }
  121. public override string ToString()
  122. {
  123. return stringValue + " " + intValue;
  124. }
  125. }
  126. static UserSetting<bool> s_StaticBoolUser = new UserSetting<bool>(settings, "tests.user.static.bool", true, SettingsScope.User);
  127. static UserSetting<bool> s_StaticBoolProject = new UserSetting<bool>(settings, "tests.project.static.bool", true, SettingsScope.Project);
  128. static UserSetting<string> s_StaticStringUser = new UserSetting<string>(settings, "tests.user.static.string", "Hello, world!", SettingsScope.User);
  129. static UserSetting<string> s_StaticStringProject = new UserSetting<string>(settings, "tests.project.static.string", "Goodbye, world!", SettingsScope.Project);
  130. static UserSetting<DummyStruct> s_StaticStructUser = new UserSetting<DummyStruct>(settings, "tests.user.static.struct", DummyStruct.defaultValue, SettingsScope.User);
  131. static UserSetting<DummyStruct> s_StaticStructProject = new UserSetting<DummyStruct>(settings, "tests.project.static.struct", DummyStruct.defaultValue, SettingsScope.Project);
  132. static UserSetting<DummyClass> s_StaticClassUser = new UserSetting<DummyClass>(settings, "tests.user.static.class", DummyClass.defaultValue, SettingsScope.User);
  133. static UserSetting<DummyClass> s_StaticClassProject = new UserSetting<DummyClass>(settings, "tests.project.static.class", DummyClass.defaultValue, SettingsScope.Project);
  134. static IUserSetting[] s_AllPreferences = new IUserSetting[]
  135. {
  136. s_StaticBoolUser,
  137. s_StaticBoolProject,
  138. s_StaticStringUser,
  139. s_StaticStringProject,
  140. s_StaticStructUser,
  141. s_StaticStructProject,
  142. s_StaticClassUser,
  143. s_StaticClassProject
  144. };
  145. [Test]
  146. public static void DefaultsAreCorrect()
  147. {
  148. try
  149. {
  150. foreach (var pref in s_AllPreferences)
  151. pref.Reset();
  152. Assert.IsTrue((bool)s_StaticBoolUser, s_StaticBoolUser.ToString());
  153. Assert.IsTrue((bool)s_StaticBoolProject, s_StaticBoolProject.ToString());
  154. Assert.AreEqual("Hello, world!", (string)s_StaticStringUser, s_StaticStringUser.ToString());
  155. Assert.AreEqual("Goodbye, world!", (string)s_StaticStringProject, s_StaticStringProject.ToString());
  156. Assert.AreEqual(DummyStruct.defaultValue, (DummyStruct)s_StaticStructUser, s_StaticStructUser.ToString());
  157. Assert.AreEqual(DummyStruct.defaultValue, (DummyStruct)s_StaticStructProject, s_StaticStructProject.ToString());
  158. Assert.AreEqual(DummyClass.defaultValue, (DummyClass)s_StaticClassUser, s_StaticClassUser.ToString());
  159. Assert.AreEqual(DummyClass.defaultValue, (DummyClass)s_StaticClassProject, s_StaticClassProject.ToString());
  160. }
  161. catch (Exception e)
  162. {
  163. Debug.LogError(e.ToString());
  164. }
  165. }
  166. [Test]
  167. public static void SetValue()
  168. {
  169. try
  170. {
  171. // BOOl
  172. s_StaticBoolUser.value = false;
  173. s_StaticBoolProject.value = false;
  174. Assert.IsFalse((bool)s_StaticBoolUser);
  175. Assert.IsFalse((bool)s_StaticBoolProject);
  176. // STRING
  177. s_StaticStringUser.value = "Some more text";
  178. s_StaticStringProject.value = "Some text here";
  179. Assert.AreEqual("Some more text", (string)s_StaticStringUser);
  180. Assert.AreEqual("Some text here", (string)s_StaticStringProject);
  181. // STRUCT
  182. var userStruct = new DummyStruct("Changed text", 23);
  183. var projectStruct = new DummyStruct("Slightly different text", -9825);
  184. s_StaticStructUser.SetValue(userStruct);
  185. s_StaticStructProject.SetValue(projectStruct);
  186. Assert.AreEqual(userStruct, (DummyStruct)s_StaticStructUser);
  187. Assert.AreEqual(projectStruct, (DummyStruct)s_StaticStructProject);
  188. // CLASS
  189. var userClass = new DummyClass("Changed text", 23);
  190. var projectClass = new DummyClass("Slightly different text", -9825);
  191. s_StaticClassUser.SetValue(userClass);
  192. s_StaticClassProject.SetValue(projectClass);
  193. Assert.AreEqual(userClass, (DummyClass)s_StaticClassUser);
  194. Assert.AreEqual(projectClass, (DummyClass)s_StaticClassProject);
  195. }
  196. catch (Exception e)
  197. {
  198. Debug.LogError(e.ToString());
  199. }
  200. }
  201. [Test]
  202. public static void SetAndReset()
  203. {
  204. try
  205. {
  206. // BOOL
  207. s_StaticBoolUser.value = false;
  208. s_StaticBoolProject.value = false;
  209. // STRING
  210. s_StaticStringUser.value = "Some more text";
  211. s_StaticStringProject.value = "Some text here";
  212. // STRUCT
  213. s_StaticStructUser.SetValue(new DummyStruct("Changed text", 23));
  214. s_StaticStructProject.SetValue(new DummyStruct("Slightly different text", -9825));
  215. // CLASS
  216. s_StaticClassUser.SetValue(new DummyClass("Changed text", 23));
  217. s_StaticClassProject.SetValue(new DummyClass("Slightly different text", -9825));
  218. Assert.IsFalse((bool)s_StaticBoolUser);
  219. Assert.IsFalse((bool)s_StaticBoolProject);
  220. Assert.AreNotEqual("Hello, world!", (string)s_StaticStringUser);
  221. Assert.AreNotEqual("Goodbye, world!", (string)s_StaticStringProject);
  222. Assert.AreNotEqual(DummyStruct.defaultValue, (DummyStruct)s_StaticStructUser);
  223. Assert.AreNotEqual(DummyStruct.defaultValue, (DummyStruct)s_StaticStructProject);
  224. Assert.AreNotEqual(DummyClass.defaultValue, (DummyClass)s_StaticClassUser);
  225. Assert.AreNotEqual(DummyClass.defaultValue, (DummyClass)s_StaticClassProject);
  226. foreach (var pref in s_AllPreferences)
  227. pref.Reset();
  228. Assert.IsTrue((bool)s_StaticBoolUser);
  229. Assert.IsTrue((bool)s_StaticBoolProject);
  230. Assert.AreEqual("Hello, world!", (string)s_StaticStringUser);
  231. Assert.AreEqual("Goodbye, world!", (string)s_StaticStringProject);
  232. Assert.AreEqual(DummyStruct.defaultValue, (DummyStruct)s_StaticStructUser);
  233. Assert.AreEqual(DummyStruct.defaultValue, (DummyStruct)s_StaticStructProject);
  234. Assert.AreEqual(DummyClass.defaultValue, (DummyClass)s_StaticClassUser);
  235. Assert.AreEqual(DummyClass.defaultValue, (DummyClass)s_StaticClassProject);
  236. }
  237. catch (Exception e)
  238. {
  239. Debug.LogError(e.ToString());
  240. }
  241. }
  242. [Test]
  243. public static void SerializeAndLoad()
  244. {
  245. try
  246. {
  247. foreach (var pref in s_AllPreferences)
  248. pref.Reset();
  249. settings.Save();
  250. var instance = new Settings(k_PackageName);
  251. Assert.AreEqual((bool)s_StaticBoolUser, instance.Get<bool>(s_StaticBoolUser.key, s_StaticBoolUser.scope));
  252. Assert.AreEqual((bool)s_StaticBoolProject, instance.Get<bool>(s_StaticBoolProject.key, s_StaticBoolProject.scope));
  253. Assert.AreEqual((string)s_StaticStringUser, instance.Get<string>(s_StaticStringUser.key, s_StaticStringUser.scope));
  254. Assert.AreEqual((string)s_StaticStringProject, instance.Get<string>(s_StaticStringProject.key, s_StaticStringProject.scope));
  255. Assert.AreEqual((DummyStruct)s_StaticStructUser, instance.Get<DummyStruct>(s_StaticStructUser.key, s_StaticStructUser.scope));
  256. Assert.AreEqual((DummyStruct)s_StaticStructProject, instance.Get<DummyStruct>(s_StaticStructProject.key, s_StaticStructProject.scope));
  257. Assert.AreEqual((DummyClass)s_StaticClassUser, instance.Get<DummyClass>(s_StaticClassUser.key, s_StaticClassUser.scope));
  258. Assert.AreEqual((DummyClass)s_StaticClassProject, instance.Get<DummyClass>(s_StaticClassProject.key, s_StaticClassProject.scope));
  259. }
  260. catch (Exception e)
  261. {
  262. Debug.LogError(e.ToString());
  263. }
  264. }
  265. [Test]
  266. public static void DeleteKeys()
  267. {
  268. try
  269. {
  270. foreach (var pref in s_AllPreferences)
  271. pref.Delete();
  272. settings.Save();
  273. var instance = new Settings(k_PackageName);
  274. Assert.IsFalse(instance.ContainsKey<bool>("tests.user.static.bool", SettingsScope.User), "tests.user.static.bool");
  275. Assert.IsFalse(instance.ContainsKey<bool>("tests.project.static.bool", SettingsScope.Project), "tests.project.static.bool");
  276. Assert.IsFalse(instance.ContainsKey<string>("tests.user.static.string", SettingsScope.User), "tests.user.static.string");
  277. Assert.IsFalse(instance.ContainsKey<string>("tests.project.static.string", SettingsScope.Project), "tests.project.static.string");
  278. Assert.IsFalse(instance.ContainsKey<DummyStruct>("tests.user.static.struct", SettingsScope.User), "tests.user.static.struct");
  279. Assert.IsFalse(instance.ContainsKey<DummyStruct>("tests.project.static.struct", SettingsScope.Project), "tests.project.static.struct");
  280. Assert.IsFalse(instance.ContainsKey<DummyClass>("tests.user.static.class", SettingsScope.User), "tests.user.static.class");
  281. Assert.IsFalse(instance.ContainsKey<DummyClass>("tests.project.static.class", SettingsScope.Project), "tests.project.static.class");
  282. }
  283. catch (Exception e)
  284. {
  285. Debug.LogError(e.ToString());
  286. }
  287. }
  288. [Test]
  289. public static void KeysExistInSettingsInstance()
  290. {
  291. try
  292. {
  293. foreach (var pref in s_AllPreferences)
  294. pref.Reset();
  295. settings.Save();
  296. Assert.IsTrue(settings.ContainsKey<bool>("tests.user.static.bool", SettingsScope.User), "tests.user.static.bool");
  297. Assert.IsTrue(settings.ContainsKey<bool>("tests.project.static.bool", SettingsScope.Project), "tests.project.static.bool");
  298. Assert.IsTrue(settings.ContainsKey<string>("tests.user.static.string", SettingsScope.User), "tests.user.static.string");
  299. Assert.IsTrue(settings.ContainsKey<string>("tests.project.static.string", SettingsScope.Project), "tests.project.static.string");
  300. Assert.IsTrue(settings.ContainsKey<DummyStruct>("tests.user.static.struct", SettingsScope.User), "tests.user.static.struct");
  301. Assert.IsTrue(settings.ContainsKey<DummyStruct>("tests.project.static.struct", SettingsScope.Project), "tests.project.static.struct");
  302. Assert.IsTrue(settings.ContainsKey<DummyClass>("tests.user.static.class", SettingsScope.User), "tests.user.static.class");
  303. Assert.IsTrue(settings.ContainsKey<DummyClass>("tests.project.static.class", SettingsScope.Project), "tests.project.static.class");
  304. }
  305. catch (Exception e)
  306. {
  307. Debug.LogError(e.ToString());
  308. }
  309. }
  310. [Test]
  311. public static void KeysExistInSerializedForm()
  312. {
  313. try
  314. {
  315. foreach (var pref in s_AllPreferences)
  316. pref.Reset();
  317. settings.Save();
  318. var instance = new Settings(k_PackageName);
  319. Assert.IsTrue(instance.ContainsKey<bool>("tests.user.static.bool", SettingsScope.User), "tests.user.static.bool");
  320. Assert.IsTrue(instance.ContainsKey<bool>("tests.project.static.bool", SettingsScope.Project), "tests.project.static.bool");
  321. Assert.IsTrue(instance.ContainsKey<string>("tests.user.static.string", SettingsScope.User), "tests.user.static.string");
  322. Assert.IsTrue(instance.ContainsKey<string>("tests.project.static.string", SettingsScope.Project), "tests.project.static.string");
  323. Assert.IsTrue(instance.ContainsKey<DummyStruct>("tests.user.static.struct", SettingsScope.User), "tests.user.static.struct");
  324. Assert.IsTrue(instance.ContainsKey<DummyStruct>("tests.project.static.struct", SettingsScope.Project), "tests.project.static.struct");
  325. Assert.IsTrue(instance.ContainsKey<DummyClass>("tests.user.static.class", SettingsScope.User), "tests.user.static.class");
  326. Assert.IsTrue(instance.ContainsKey<DummyClass>("tests.project.static.class", SettingsScope.Project), "tests.project.static.class");
  327. }
  328. catch (Exception e)
  329. {
  330. Debug.LogError(e.ToString());
  331. }
  332. }
  333. [Test]
  334. public static void ChangingClassValuesSaves()
  335. {
  336. try
  337. {
  338. s_StaticClassUser.Reset();
  339. s_StaticClassProject.Reset();
  340. Assert.AreEqual(DummyClass.defaultValue, (DummyClass)s_StaticClassUser);
  341. Assert.AreEqual(DummyClass.defaultValue, (DummyClass)s_StaticClassProject);
  342. var userReference = s_StaticClassUser.value;
  343. var projectReference = s_StaticClassProject.value;
  344. userReference.intValue = 200;
  345. projectReference.intValue = 200;
  346. s_StaticClassProject.ApplyModifiedProperties();
  347. s_StaticClassUser.ApplyModifiedProperties();
  348. Assert.IsTrue(ReferenceEquals(s_StaticClassProject.value, projectReference));
  349. Assert.IsTrue(ReferenceEquals(s_StaticClassUser.value, userReference));
  350. Assert.AreEqual(200, s_StaticClassUser.value.intValue, "After ApplyModifiedProperties");
  351. Assert.AreEqual(200, s_StaticClassProject.value.intValue, "After ApplyModifiedProperties");
  352. settings.Save();
  353. var instance = new Settings(k_PackageName);
  354. Assert.AreEqual(200, instance.Get<DummyClass>(s_StaticClassUser.key, s_StaticClassUser.scope).intValue, "Reload Settings Instance");
  355. Assert.AreEqual(200, instance.Get<DummyClass>(s_StaticClassProject.key, s_StaticClassProject.scope).intValue, "Reload Settings Instance");
  356. }
  357. catch (Exception e)
  358. {
  359. Debug.LogError(e.ToString());
  360. }
  361. }
  362. }
  363. }