PageRenderTime 47ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/UnitTest/UnitTest.cs

https://github.com/saleyn/otp.net
C# | 497 lines | 449 code | 45 blank | 3 comment | 16 complexity | 98932f3d3f267ba673f06a291806c292 MD5 | raw file
  1. using System;
  2. using System.Text;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using NUnit.Framework;
  6. using Otp;
  7. using System.Collections.Concurrent;
  8. using KVP = System.Collections.Generic.KeyValuePair<Otp.Erlang.PatternMatcher.Pattern, Otp.Erlang.VarBind>;
  9. namespace Otp
  10. {
  11. /// <summary>
  12. /// Summary description for UnitTest1
  13. /// </summary>
  14. [TestFixture]
  15. public class UnitTest1
  16. {
  17. [Test]
  18. public void TestEncodeDecode()
  19. {
  20. {
  21. OtpOutputStream os = new OtpOutputStream(new Erlang.Atom("abc"));
  22. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  23. Assert.IsTrue("abc" == ins.read_atom());
  24. }
  25. {
  26. OtpOutputStream os = new OtpOutputStream(new Erlang.String("string"));
  27. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  28. Assert.IsTrue("string" == ins.read_string());
  29. }
  30. {
  31. Erlang.Pid pid = new Erlang.Pid("abc", 1, 2, 3);
  32. OtpOutputStream os = new OtpOutputStream(pid);
  33. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  34. Assert.IsTrue(pid.Equals(ins.read_pid()));
  35. }
  36. {
  37. Erlang.Port p = new Erlang.Port("abc", 1, 2);
  38. OtpOutputStream os = new OtpOutputStream(p);
  39. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  40. Assert.IsTrue(p.Equals(ins.read_port()));
  41. }
  42. {
  43. Erlang.Ref p = new Erlang.Ref("abc", new int[3] { 1, 2, 3 }, 2);
  44. OtpOutputStream os = new OtpOutputStream(p);
  45. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  46. Assert.IsTrue(p.Equals(ins.read_ref()));
  47. }
  48. {
  49. OtpOutputStream os = new OtpOutputStream();
  50. os.write_long(1);
  51. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  52. long n = ins.read_long();
  53. Assert.IsTrue(1 == n);
  54. }
  55. {
  56. OtpOutputStream os = new OtpOutputStream();
  57. os.write_long(0xFFFFFF);
  58. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  59. long n = ins.read_long();
  60. Assert.IsTrue(0xFFFFFF == n);
  61. }
  62. {
  63. OtpOutputStream os = new OtpOutputStream();
  64. os.write_long(0xFFFFFFFF);
  65. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  66. long n = ins.read_long();
  67. Assert.IsTrue(0xFFFFFFFF == n);
  68. }
  69. {
  70. OtpOutputStream os = new OtpOutputStream();
  71. os.write_ulong((ulong)0xFFFFFFFFFF);
  72. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  73. ulong n = ins.read_ulong();
  74. Assert.IsTrue((ulong)0xFFFFFFFFFF == n);
  75. }
  76. {
  77. OtpOutputStream os = new OtpOutputStream();
  78. os.write_ulong((ulong)0xFFFFFFFFFFFF);
  79. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  80. ulong n = ins.read_ulong();
  81. Assert.IsTrue((ulong)0xFFFFFFFFFFFF == n);
  82. }
  83. {
  84. OtpOutputStream os = new OtpOutputStream();
  85. os.write_ulong((ulong)0xFFFFFFFFFFFFFF);
  86. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  87. ulong n = ins.read_ulong();
  88. Assert.IsTrue((ulong)0xFFFFFFFFFFFFFF == n);
  89. }
  90. {
  91. OtpOutputStream os = new OtpOutputStream();
  92. os.write_ulong((ulong)0xFFFFFFFFFFFFFFFF);
  93. OtpInputStream ins = new OtpInputStream(os.getBuffer(), 0, os.size());
  94. ulong n = ins.read_ulong();
  95. Assert.IsTrue((ulong)0xFFFFFFFFFFFFFFFF == n);
  96. }
  97. }
  98. [Test]
  99. public void TestPatternMatch()
  100. {
  101. {
  102. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  103. Erlang.Object obj = Erlang.Object.Format("{snapshot, x12, []}");
  104. Erlang.Object pat = Erlang.Object.Format("{snapshot, N, L}");
  105. Assert.IsTrue(pat.match(obj, binding));
  106. Erlang.Atom n = binding.find("N") as Erlang.Atom;
  107. Erlang.List l = binding.find("L") as Erlang.List;
  108. Assert.IsNotNull(n);
  109. Assert.IsNotNull(l);
  110. Assert.IsTrue(l.Length == 0);
  111. }
  112. {
  113. Erlang.Object pat = Erlang.Object.Format("{test, A, B, C}");
  114. Erlang.Object obj = Erlang.Object.Format("{test, 10, a, [1,2,3]}");
  115. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  116. Assert.IsTrue(pat.match(obj, binding));
  117. Assert.AreEqual(3, binding.Count);
  118. Assert.AreEqual(10, binding["A"].longValue());
  119. Assert.AreEqual("a", binding["B"].atomValue());
  120. Assert.AreEqual("[1,2,3]", binding["C"].ToString());
  121. }
  122. {
  123. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  124. Erlang.Object obj = Erlang.Object.Format("[1,a,$b,\"xyz\",{1,10.0},[]]");
  125. Erlang.Object pat = Erlang.Object.Format("[A,B,C,D,E,F]");
  126. Assert.IsTrue(pat.match(obj, binding));
  127. Assert.IsNotNull(binding.find("A") as Erlang.Long);
  128. Assert.IsNotNull(binding.find("B") as Erlang.Atom);
  129. Assert.IsNotNull(binding.find("C") as Erlang.Char);
  130. Assert.IsNotNull(binding.find("D") as Erlang.String);
  131. Assert.IsNotNull(binding.find("E") as Erlang.Tuple);
  132. Assert.IsNotNull(binding.find("F") as Erlang.List);
  133. Assert.IsTrue(binding.find("E").Cast<Erlang.Tuple>().arity() == 2);
  134. Assert.IsTrue(binding.find("F").Cast<Erlang.List>().Length == 0);
  135. }
  136. Erlang.Object pattern = Erlang.Object.Format("{test, T}");
  137. string exp = "{test, ~w}";
  138. {
  139. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  140. Erlang.Object obj = Erlang.Object.Format(exp, (int)3);
  141. Assert.IsTrue(pattern.match(obj, binding));
  142. Assert.AreEqual(3, binding.find("T").intValue());
  143. }
  144. {
  145. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  146. Erlang.Object obj = Erlang.Object.Format(exp, (long)100);
  147. Assert.IsTrue(pattern.match(obj, binding));
  148. Assert.AreEqual(100, binding.find("T").longValue());
  149. }
  150. {
  151. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  152. Erlang.Object obj = Erlang.Object.Format(exp, 100.0);
  153. Assert.IsTrue(pattern.match(obj, binding));
  154. Assert.AreEqual(100.0, binding.find("T").doubleValue());
  155. }
  156. {
  157. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  158. Erlang.Object obj = Erlang.Object.Format(exp, "test");
  159. Assert.IsTrue(pattern.match(obj, binding));
  160. Assert.AreEqual("test", binding.find("T").stringValue());
  161. }
  162. {
  163. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  164. Erlang.Object obj = Erlang.Object.Format(exp, true);
  165. Assert.IsTrue(pattern.match(obj, binding));
  166. Assert.AreEqual(true, binding.find("T").boolValue());
  167. }
  168. {
  169. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  170. Erlang.Object obj = Erlang.Object.Format(exp, 'c');
  171. Assert.IsTrue(pattern.match(obj, binding));
  172. Assert.AreEqual('c', binding.find("T").charValue());
  173. }
  174. {
  175. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  176. Erlang.Pid pid = new Erlang.Pid("tmp", 1, 2, 3);
  177. Erlang.Object obj = Erlang.Object.Format(exp, pid as Erlang.Object);
  178. Assert.IsTrue(pattern.match(obj, binding));
  179. Assert.AreEqual(pid, binding.find("T").pidValue());
  180. obj = Erlang.Object.Format(exp, pid);
  181. Assert.IsTrue(pattern.match(obj, binding));
  182. Assert.AreEqual(pid, binding.find("T").pidValue());
  183. }
  184. {
  185. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  186. Erlang.Ref reference = new Erlang.Ref("tmp", 1, 2);
  187. Erlang.Object obj = Erlang.Object.Format(exp, reference);
  188. Assert.IsTrue(pattern.match(obj, binding));
  189. Assert.AreEqual(reference, binding.find("T").refValue());
  190. }
  191. {
  192. Erlang.VarBind binding = new Otp.Erlang.VarBind();
  193. Erlang.List obj = new Erlang.List(new Erlang.Int(10), new Erlang.Double(30.0),
  194. new Erlang.String("abc"), new Erlang.Atom("a"),
  195. new Erlang.Binary(new byte[] { 1, 2, 3 }), false, new Erlang.Boolean(true));
  196. Erlang.Object pat = Erlang.Object.Format("T");
  197. Assert.IsTrue(pat.match(obj, binding));
  198. Erlang.Object expected = Erlang.Object.Format("[10, 30.0, \"abc\", 'a', ~w, \'false\', true]",
  199. new Erlang.Binary(new byte[] { 1, 2, 3 }));
  200. Erlang.Object result = binding.find("T");
  201. Assert.IsTrue(expected.Equals(result));
  202. }
  203. }
  204. [Test]
  205. public void TestFormat()
  206. {
  207. {
  208. Erlang.Object obj1 = Erlang.Object.Format("a");
  209. Assert.IsInstanceOf(typeof(Erlang.Atom), obj1);
  210. Assert.AreEqual("a", (obj1 as Erlang.Atom).atomValue());
  211. }
  212. {
  213. Erlang.Object obj1 = Erlang.Object.Format("$a");
  214. Assert.IsInstanceOf(typeof(Erlang.Char), obj1);
  215. Assert.AreEqual('a', (obj1 as Erlang.Char).charValue());
  216. }
  217. {
  218. Erlang.Object obj1 = Erlang.Object.Format("'Abc'");
  219. Assert.IsInstanceOf(typeof(Erlang.Atom), obj1);
  220. Assert.AreEqual("Abc", (obj1 as Erlang.Atom).atomValue());
  221. }
  222. {
  223. Erlang.Object obj1 = Erlang.Object.Format("{'true', 'false', true, false}");
  224. Assert.IsInstanceOf(typeof(Erlang.Tuple), obj1);
  225. Erlang.Tuple t = obj1.Cast<Erlang.Tuple>();
  226. Assert.AreEqual(4, t.arity());
  227. foreach (Erlang.Object term in t.elements())
  228. Assert.IsInstanceOf(typeof(Erlang.Boolean), term);
  229. Assert.AreEqual(true, t[0].boolValue());
  230. Assert.AreEqual(false,t[1].boolValue());
  231. Assert.AreEqual(true, t[2].boolValue());
  232. Assert.AreEqual(false,t[3].boolValue());
  233. }
  234. {
  235. Erlang.Object obj1 = Erlang.Object.Format("\"Abc\"");
  236. Assert.IsInstanceOf(typeof(Erlang.String), obj1);
  237. Assert.AreEqual("Abc", (obj1 as Erlang.String).stringValue());
  238. }
  239. {
  240. Erlang.Object obj1 = Erlang.Object.Format("Abc");
  241. Assert.IsInstanceOf(typeof(Erlang.Var), obj1);
  242. Assert.AreEqual("Abc", (obj1 as Erlang.Var).name());
  243. }
  244. {
  245. Erlang.Object obj1 = Erlang.Object.Format("1");
  246. Assert.IsInstanceOf(typeof(Erlang.Long), obj1);
  247. Assert.AreEqual(1, (obj1 as Erlang.Long).longValue());
  248. }
  249. {
  250. Erlang.Object obj1 = Erlang.Object.Format("1.23");
  251. Assert.IsInstanceOf(typeof(Erlang.Double), obj1);
  252. Assert.AreEqual(1.23, (obj1 as Erlang.Double).doubleValue());
  253. }
  254. {
  255. Erlang.Object obj1 = Erlang.Object.Format("V");
  256. Assert.IsInstanceOf(typeof(Erlang.Var), obj1);
  257. Assert.AreEqual("V", (obj1 as Erlang.Var).name());
  258. }
  259. {
  260. Erlang.Object obj1 = Erlang.Object.Format("{1}");
  261. Assert.IsInstanceOf(typeof(Erlang.Tuple), obj1);
  262. Assert.AreEqual(1, (obj1 as Erlang.Tuple).arity());
  263. Assert.IsInstanceOf(typeof(Erlang.Long), (obj1 as Erlang.Tuple)[0]);
  264. Assert.AreEqual(1, ((obj1 as Erlang.Tuple)[0] as Erlang.Long).longValue());
  265. }
  266. {
  267. Erlang.Object obj0 = Erlang.Object.Format("[]");
  268. Assert.IsInstanceOf(typeof(Erlang.List), obj0);
  269. Assert.AreEqual(0, (obj0 as Erlang.List).arity());
  270. Erlang.Object obj1 = Erlang.Object.Format("[1]");
  271. Assert.IsInstanceOf(typeof(Erlang.List), obj1);
  272. Assert.AreEqual(1, (obj1 as Erlang.List).arity());
  273. Assert.IsInstanceOf(typeof(Erlang.Long), (obj1 as Erlang.List)[0]);
  274. Assert.AreEqual(1, ((obj1 as Erlang.List)[0] as Erlang.Long).longValue());
  275. }
  276. {
  277. Erlang.Object obj1 = Erlang.Object.Format("[{1,2}, []]");
  278. Assert.IsInstanceOf(typeof(Erlang.List), obj1);
  279. Assert.AreEqual(2, (obj1 as Erlang.List).arity());
  280. Assert.IsInstanceOf(typeof(Erlang.Tuple), (obj1 as Erlang.List)[0]);
  281. Assert.AreEqual(2, ((obj1 as Erlang.List)[0] as Erlang.Tuple).arity());
  282. Assert.AreEqual(0, ((obj1 as Erlang.List)[1] as Erlang.List).arity());
  283. }
  284. {
  285. Erlang.Object obj1 = Erlang.Object.Format("{a, [b, 1, 2.0, \"abc\"], {1, 2}}");
  286. Assert.IsInstanceOf(typeof(Erlang.Tuple), obj1);
  287. Assert.AreEqual(3, (obj1 as Erlang.Tuple).arity());
  288. }
  289. {
  290. Erlang.Object obj1 = Erlang.Object.Format("~w", 1);
  291. Assert.IsInstanceOf(typeof(Erlang.Long), obj1);
  292. Assert.AreEqual(1, (obj1 as Erlang.Long).longValue());
  293. Erlang.Object obj2 = Erlang.Object.Format("{~w, ~w,~w}", 1, 2, 3);
  294. Assert.IsInstanceOf(typeof(Erlang.Tuple), obj2);
  295. Assert.AreEqual(3, (obj2 as Erlang.Tuple).arity());
  296. Assert.IsInstanceOf(typeof(Erlang.Long), (obj2 as Erlang.Tuple)[0]);
  297. Assert.AreEqual(1, ((obj2 as Erlang.Tuple)[0] as Erlang.Long).longValue());
  298. Assert.IsInstanceOf(typeof(Erlang.Long), (obj2 as Erlang.Tuple)[1]);
  299. Assert.AreEqual(2, ((obj2 as Erlang.Tuple)[1] as Erlang.Long).longValue());
  300. Assert.IsInstanceOf(typeof(Erlang.Long), (obj2 as Erlang.Tuple)[2]);
  301. Assert.AreEqual(3, ((obj2 as Erlang.Tuple)[2] as Erlang.Long).longValue());
  302. }
  303. {
  304. Erlang.Object obj2 = Erlang.Object.Format("{~w, ~w,~w,~w, ~w}", 1.0, 'a', "abc", 2, true);
  305. Assert.IsInstanceOf(typeof(Erlang.Tuple), obj2);
  306. Assert.AreEqual(5, (obj2 as Erlang.Tuple).arity());
  307. Assert.IsInstanceOf(typeof(Erlang.Double), (obj2 as Erlang.Tuple)[0]);
  308. Assert.AreEqual(1.0, ((obj2 as Erlang.Tuple)[0] as Erlang.Double).doubleValue());
  309. Assert.IsInstanceOf(typeof(Erlang.Char), (obj2 as Erlang.Tuple)[1]);
  310. Assert.AreEqual('a', ((obj2 as Erlang.Tuple)[1] as Erlang.Char).charValue());
  311. Assert.IsInstanceOf(typeof(Erlang.String), (obj2 as Erlang.Tuple)[2]);
  312. Assert.AreEqual("abc", ((obj2 as Erlang.Tuple)[2] as Erlang.String).stringValue());
  313. Assert.IsInstanceOf(typeof(Erlang.Long), (obj2 as Erlang.Tuple)[3]);
  314. Assert.AreEqual(2, ((obj2 as Erlang.Tuple)[3] as Erlang.Long).longValue());
  315. Assert.IsInstanceOf(typeof(Erlang.Boolean), (obj2 as Erlang.Tuple)[4]);
  316. Assert.AreEqual(true, ((obj2 as Erlang.Tuple)[4] as Erlang.Boolean).booleanValue());
  317. }
  318. }
  319. [Test]
  320. public void TestFormatVariable()
  321. {
  322. var cases = new Dictionary<string, Erlang.TermType> {
  323. { "B", Erlang.TermType.Object },
  324. { "B::int()", Erlang.TermType.Int },
  325. { "B::integer()", Erlang.TermType.Int },
  326. { "B::string()", Erlang.TermType.String },
  327. { "B::atom()", Erlang.TermType.Atom },
  328. { "B::float()", Erlang.TermType.Double },
  329. { "B::double()", Erlang.TermType.Double },
  330. { "B::binary()", Erlang.TermType.Binary },
  331. { "B::bool()", Erlang.TermType.Boolean },
  332. { "B::boolean()", Erlang.TermType.Boolean },
  333. { "B::byte()", Erlang.TermType.Byte },
  334. { "B::char()", Erlang.TermType.Char },
  335. { "B::list()", Erlang.TermType.List },
  336. { "B::tuple()", Erlang.TermType.Tuple },
  337. { "B::pid()", Erlang.TermType.Pid },
  338. { "B::ref()", Erlang.TermType.Ref },
  339. { "B::reference()", Erlang.TermType.Ref },
  340. { "B::port()", Erlang.TermType.Port }
  341. };
  342. foreach (var p in cases)
  343. {
  344. Erlang.Object o = Erlang.Object.Format(p.Key);
  345. Assert.IsInstanceOf(typeof(Erlang.Var), o);
  346. Assert.AreEqual(p.Value, o.Cast<Erlang.Var>().VarTermType);
  347. }
  348. var pat1 = Erlang.Object.Format("{A::char(), B::tuple(), C::float(), D::list(), [E::string(), F::int()], G::bool()}");
  349. var obj1 = Erlang.Object.Format("{$a, {1,2,3}, 10.0, [5,6], [\"abc\", 190], true}");
  350. var binding = new Erlang.VarBind();
  351. Assert.IsTrue(pat1.match(obj1, binding)); // Match unbound variables
  352. Assert.IsTrue(pat1.match(obj1, binding)); // Match bound variables
  353. var obj2 = Erlang.Object.Format("{$a, {1,2,3}, 20.0, [5,6], [\"abc\", 190], true}");
  354. Assert.IsFalse(pat1.match(obj2, binding)); // Match bound variables
  355. binding.clear();
  356. var obj3 = Erlang.Object.Format("{$a, {1,2,3}, 10.0, [5,6], [\"abc\", bad], false}");
  357. Assert.IsFalse(pat1.match(obj3, binding));
  358. }
  359. public class KeyValueList<TKey, TValue> : List<KeyValuePair<TKey, TValue>>
  360. {
  361. public void Add(TKey key, TValue value)
  362. {
  363. Add(new KeyValuePair<TKey, TValue>(key, value));
  364. }
  365. }
  366. [Test]
  367. public void TestMatchVariable()
  368. {
  369. var cases = new KeyValueList<string, Erlang.Object> {
  370. { "B", new Erlang.Int(1) },
  371. { "B", new Erlang.Atom("abc") },
  372. { "B", new Erlang.String("efg") },
  373. { "B", new Erlang.Double(10.0) },
  374. { "B::int()", new Erlang.Int(10) },
  375. { "B::integer()", new Erlang.Int(20) },
  376. { "B::string()", new Erlang.String("xxx") },
  377. { "B::atom()", new Erlang.Atom("xyz") },
  378. { "B::float()", new Erlang.Double(5.0) },
  379. { "B::double()", new Erlang.Double(3.0) },
  380. { "B::binary()", new Erlang.Binary(new byte[] {1,2,3}) },
  381. { "B::bool()", new Erlang.Boolean(true) },
  382. { "B::boolean()", new Erlang.Boolean(false) },
  383. { "B::byte()", new Erlang.Byte(1) },
  384. { "B::char()", new Erlang.Char('a') },
  385. { "B::list()", new Erlang.List(1, 2, 3) },
  386. { "B::tuple()", new Erlang.Tuple(new Erlang.Char('a'), 1, "aaa") },
  387. { "B::pid()", new Erlang.Pid("xxx", 1, 2, 3) },
  388. { "B::ref()", new Erlang.Ref("xxx", 1, 3) },
  389. { "B::reference()", new Erlang.Ref("xxx", 1, 3) },
  390. { "B::port()", new Erlang.Port("xxx", 1, 3) }
  391. };
  392. foreach (var p in cases)
  393. {
  394. {
  395. Erlang.Object pat = Erlang.Object.Format(p.Key);
  396. Erlang.Object obj = p.Value;
  397. var binding = new Erlang.VarBind();
  398. binding["B"] = obj;
  399. Assert.IsTrue(pat.match(obj, binding));
  400. }
  401. {
  402. Erlang.Object pat = Erlang.Object.Format(p.Key);
  403. Erlang.Object obj = p.Value;
  404. var binding = new Erlang.VarBind();
  405. Assert.IsTrue(pat.match(obj, binding));
  406. var b = binding["B"];
  407. Assert.AreEqual(obj.Type, b.Type);
  408. Assert.IsTrue(obj.Equals(b));
  409. }
  410. }
  411. var revCases = cases.Reverse<KeyValuePair<string,Erlang.Object>>().ToList();
  412. cases.Zip(revCases,
  413. (p1, p2) => {
  414. Erlang.Var pat = Erlang.Object.Format(p1.Key).AsVar();
  415. Erlang.Object obj = p2.Value;
  416. var binding = new Erlang.VarBind();
  417. if (pat.VarTermType == Erlang.TermType.Object || pat.VarTermType == obj.TermType)
  418. Assert.IsTrue(pat.match(obj, binding));
  419. else
  420. Assert.IsFalse(pat.match(obj, binding));
  421. return false;
  422. }).ToList();
  423. }
  424. [Test]
  425. public void PatternMatchCollectionTest()
  426. {
  427. var state = new KVP();
  428. var pm = new Erlang.PatternMatcher
  429. {
  430. { 0, "{A::integer(), stop}" , (_ctx, p, t, b, _args) => state = new KVP(p, b) },
  431. { "{A::integer(), status}" , (p, t, b, _args) => state = new KVP(p, b) },
  432. { 1, "{A::integer(), {status, B::atom()}}", (_ctx, p, t, b, _args) => state = new KVP(p, b) },
  433. { "{A::integer(), {config, B::list()}}", (p, t, b, _args) => state = new KVP(p, b) }
  434. };
  435. Assert.AreEqual(1, pm.Match(Erlang.Object.Format("{10, stop}")));
  436. Assert.AreEqual(10, state.Value["A"].intValue());
  437. Assert.AreEqual(2, pm.Match(Erlang.Object.Format("{11, status}")));
  438. Assert.AreEqual(11, state.Value["A"].intValue());
  439. Assert.AreEqual(3, pm.Match(Erlang.Object.Format("{12, {status, ~w}}", new Erlang.Atom("a"))));
  440. Assert.AreEqual(12, state.Value["A"].intValue());
  441. Assert.AreEqual("a",state.Value["B"].atomValue().ToString());
  442. Assert.AreEqual(4, pm.Match(Erlang.Object.Format("{13, {config, ~w}}", new Erlang.List())));
  443. Assert.AreEqual(13, state.Value["A"].intValue());
  444. Assert.AreEqual(0, state.Value["B"].listValue().Length);
  445. Assert.AreEqual(-1, pm.Match(Erlang.Object.Format("{10, exit}")));
  446. var pts = pm.PatternsToString;
  447. Assert.AreEqual(
  448. "[{A::int(),stop},{A::int(),status},{A::int(),{status,B::atom()}},{A::int(),{config,B::list()}}]",
  449. pts);
  450. }
  451. }
  452. }