/Clojure/Clojure.Tests/LibTests/KeywordTests.cs

https://github.com/abimaran/clojure-clr · C# · 276 lines · 193 code · 60 blank · 23 comment · 0 complexity · 73690172408ee0644e0f55f708c9321a MD5 · raw file

  1. /**
  2. * Copyright (c) Rich Hickey. All rights reserved.
  3. * The use and distribution terms for this software are covered by the
  4. * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
  5. * which can be found in the file epl-v10.html at the root of this distribution.
  6. * By using this software in any fashion, you are agreeing to be bound by
  7. * the terms of this license.
  8. * You must not remove this notice, or any other, from this software.
  9. **/
  10. /**
  11. * Author: David Miller
  12. **/
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using NUnit.Framework;
  18. using Rhino.Mocks;
  19. using clojure.lang;
  20. using RMExpect = Rhino.Mocks.Expect;
  21. using System.Collections;
  22. using System.IO;
  23. using System.Runtime.Serialization.Formatters.Binary;
  24. namespace Clojure.Tests.LibTests
  25. {
  26. [TestFixture]
  27. public class KeywordTests : AssertionHelper
  28. {
  29. #region c-tor tests
  30. [Test]
  31. public void InternCreatesKeywordBasedOnSymbol()
  32. {
  33. Symbol sym = Symbol.intern("def","abc");
  34. Keyword k1 = Keyword.intern(sym);
  35. Expect(k1.Name,EqualTo(sym.Name));
  36. Expect(k1.Namespace,EqualTo(sym.Namespace));
  37. }
  38. [Test]
  39. public void InternReturnsSameKeywordOnEqualSym()
  40. {
  41. Symbol sym1 = Symbol.intern("def", "abc");
  42. Symbol sym2 = Symbol.intern("def", "abc");
  43. Keyword k1 = Keyword.intern(sym1);
  44. Keyword k2 = Keyword.intern(sym2);
  45. Expect(Object.ReferenceEquals(k1, k2));
  46. }
  47. [Test]
  48. public void Intern2CreatesKeywordBasedOnSymbol()
  49. {
  50. Keyword k1 = Keyword.intern("def","abc");
  51. Expect(k1.Name, EqualTo("abc"));
  52. Expect(k1.Namespace, EqualTo("def"));
  53. }
  54. [Test]
  55. public void Intern2ReturnsSameKeywordOnEqualSym()
  56. {
  57. Keyword k1 = Keyword.intern("def", "abc");
  58. Keyword k2 = Keyword.intern("def", "abc");
  59. Expect(Object.ReferenceEquals(k1, k2));
  60. }
  61. #endregion
  62. #region object override tests
  63. [Test]
  64. public void ToStringReturnsStringNameWithColonPrepended()
  65. {
  66. Symbol sym1 = Symbol.intern("abc");
  67. Symbol sym2 = Symbol.intern("abc/def");
  68. Keyword k1 = Keyword.intern(sym1);
  69. Keyword k2 = Keyword.intern(sym2);
  70. Expect(k1.ToString(), EqualTo(":abc"));
  71. Expect(k2.ToString(), EqualTo(":abc/def"));
  72. }
  73. [Test]
  74. public void EqualOnIdentityIsTrue()
  75. {
  76. Symbol sym1 = Symbol.intern("abc");
  77. Keyword k1 = Keyword.intern(sym1);
  78. Expect(k1.Equals(k1));
  79. }
  80. [Test]
  81. public void EqualsOnNonKeywordIsFalse()
  82. {
  83. Symbol sym1 = Symbol.intern("abc");
  84. Keyword k1 = Keyword.intern(sym1);
  85. Expect(k1.Equals(sym1), False);
  86. }
  87. //[Test]
  88. //public void EqualsDependsOnSym()
  89. //{
  90. // Symbol sym1 = Symbol.intern("abc");
  91. // Symbol sym2 = Symbol.intern("abc");
  92. // Keyword k1 = Keyword.intern(sym1);
  93. // Keyword k2 = Keyword.intern(sym2);
  94. // // I don't know how we ever create two keywords that will force
  95. // // the code to go into the sym.equals part of the code.
  96. // // At least, not through the factory methods.
  97. //}
  98. [Test]
  99. public void HashCodeDependsOnValue()
  100. {
  101. Symbol sym1 = Symbol.intern("abc");
  102. Symbol sym2 = Symbol.intern("abc/def");
  103. Keyword k1 = Keyword.intern(sym1);
  104. Keyword k2 = Keyword.intern(sym2);
  105. Expect(k1.GetHashCode(), Not.EqualTo(k2.GetHashCode()));
  106. }
  107. #endregion
  108. #region Named tests
  109. public void NameAndNamespaceComeFromTheSymbol()
  110. {
  111. Symbol sym1 = Symbol.intern("def", "abc");
  112. Keyword k1 = Keyword.intern(sym1);
  113. Symbol sym2 = Symbol.intern("abc");
  114. Keyword k2 = Keyword.intern(sym2);
  115. Expect(k1.Name, EqualTo("abc"));
  116. Expect(k1.Namespace, EqualTo("def"));
  117. Expect(k2.Name, EqualTo("abc"));
  118. Expect(k2.Namespace, Null);
  119. }
  120. #endregion
  121. #region IFn Tests
  122. [Test]
  123. public void Invoke2IndexesIntoItsFirstArg()
  124. {
  125. Keyword k1 = Keyword.intern(Symbol.intern("abc"));
  126. Keyword k2 = Keyword.intern(Symbol.intern("ab"));
  127. IDictionary dict = new Hashtable();
  128. dict[k1] = 7;
  129. dict["abc"] = 8;
  130. Expect(k1.invoke(dict), EqualTo(7));
  131. Expect(k2.invoke(dict), Null);
  132. }
  133. [Test]
  134. public void Invoke3IndexesIntoItsFirstArg()
  135. {
  136. Keyword k1 = Keyword.intern(Symbol.intern("abc"));
  137. Keyword k2 = Keyword.intern(Symbol.intern("ab"));
  138. IDictionary dict = new Hashtable();
  139. dict[k1] = 7;
  140. dict["abc"] = 8;
  141. Expect(k1.invoke(dict, 20), EqualTo(7));
  142. Expect(k2.invoke(dict, 20), EqualTo(20));
  143. }
  144. [Test]
  145. [ExpectedException(typeof(ArgumentException))]
  146. public void InvokeOnNoArgsFails()
  147. {
  148. Keyword k1 = Keyword.intern(Symbol.intern("abc"));
  149. object o = k1.invoke();
  150. }
  151. [Test]
  152. [ExpectedException(typeof(ArgumentException))]
  153. public void InvokeOnTooManyArgsFails()
  154. {
  155. Keyword k1 = Keyword.intern(Symbol.intern("abc"));
  156. IDictionary dict = new Hashtable();
  157. dict[k1] = 7;
  158. dict["abc"] = 8;
  159. object o = k1.invoke(dict, 20, null);
  160. }
  161. #endregion
  162. #region IComparable tests
  163. [Test]
  164. [ExpectedException(typeof(InvalidCastException))]
  165. public void CompareToNonKeywordFails()
  166. {
  167. Symbol s1 = Symbol.intern("abc");
  168. Keyword k1 = Keyword.intern(s1);
  169. int c = k1.CompareTo(s1);
  170. }
  171. [Test]
  172. public void CompareToEqualKeywordIsZero()
  173. {
  174. Keyword k1 = Keyword.intern(Symbol.intern("abc"));
  175. Keyword k2 = Keyword.intern(Symbol.intern("abc"));
  176. Expect(k1.CompareTo(k2), EqualTo(0));
  177. }
  178. [Test]
  179. public void CompareDependsOnSymbolCompare()
  180. {
  181. Symbol sym1 = Symbol.intern("abc");
  182. Symbol sym2 = Symbol.intern("a", "abc");
  183. Symbol sym3 = Symbol.intern("b", "abc");
  184. Keyword k1 = Keyword.intern(sym1);
  185. Keyword k2 = Keyword.intern(sym2);
  186. Keyword k3 = Keyword.intern(sym3);
  187. Expect(k1.CompareTo(k2), LessThan(0));
  188. Expect(k2.CompareTo(k1), GreaterThan(0));
  189. Expect(k1.CompareTo(k3), LessThan(0));
  190. Expect(k3.CompareTo(k1), GreaterThan(0));
  191. }
  192. #endregion
  193. #region Serializability tests
  194. [Test]
  195. public void Serialization_preserves_keyword_uniqueness()
  196. {
  197. MemoryStream ms = new MemoryStream();
  198. Keyword k1 = Keyword.intern("def", "abc");
  199. Keyword k2 = Keyword.intern("def", "xyz");
  200. List<Keyword> keywords = new List<Keyword>();
  201. keywords.Add(k1);
  202. keywords.Add(k2);
  203. keywords.Add(k1);
  204. keywords.Add(k2);
  205. BinaryFormatter bf = new BinaryFormatter();
  206. bf.Serialize(ms,keywords);
  207. ms.Seek(0, SeekOrigin.Begin);
  208. List<Keyword> inKeys = (List<Keyword>)bf.Deserialize(ms);
  209. Expect(Object.ReferenceEquals(inKeys[0],k1));
  210. Expect(Object.ReferenceEquals(inKeys[1],k2));
  211. Expect(Object.ReferenceEquals(inKeys[2],k1));
  212. Expect(Object.ReferenceEquals(inKeys[3],k2));
  213. }
  214. #endregion
  215. }
  216. }