From 67f56f0795ac0214f9828c42f8face229e204c1d Mon Sep 17 00:00:00 2001 From: David Miller Date: Sat, 21 Feb 2009 06:55:20 +0000 Subject: ClojureCLR: added ClojureCLR project to repo. --- .../Clojure/Clojure.Console/Clojure.Console.csproj | 82 + .../Clojure/Clojure.Console/ClojureConsole.cs | 217 ++ .../Clojure.Console/Properties/AssemblyInfo.cs | 36 + ClojureCLR/Clojure/Clojure.Console/app.config | 3 + .../Clojure/Clojure.Tests/Clojure.Tests.csproj | 121 + .../Clojure/Clojure.Tests/LibTests/AFnImplTests.cs | 22 + .../LibTests/APersistentVectorTests.cs | 707 ++++ .../Clojure/Clojure.Tests/LibTests/ARefTests.cs | 22 + .../Clojure.Tests/LibTests/AReferenceTests.cs | 98 + .../Clojure/Clojure.Tests/LibTests/AgentTests.cs | 22 + .../Clojure.Tests/LibTests/ArraySeqTests.cs | 214 ++ .../Clojure.Tests/LibTests/ArrayStreamTests.cs | 22 + .../Clojure/Clojure.Tests/LibTests/AtomTests.cs | 22 + .../Clojure.Tests/LibTests/CachedSeqTests.cs | 22 + .../Clojure/Clojure.Tests/LibTests/ConsTests.cs | 428 +++ .../Clojure/Clojure.Tests/LibTests/DelayTests.cs | 22 + .../Clojure/Clojure.Tests/LibTests/FnSeqTests.cs | 120 + .../Clojure/Clojure.Tests/LibTests/IObjTests.cs | 91 + .../Clojure.Tests/LibTests/ISeqTestHelper.cs | 54 + .../Clojure.Tests/LibTests/IteratorStreamTests.cs | 22 + .../Clojure/Clojure.Tests/LibTests/KeywordTests.cs | 239 ++ .../LibTests/LazilyPersistentVectorTests.cs | 220 ++ .../Clojure.Tests/LibTests/LazyConsTests.cs | 123 + .../Clojure.Tests/LibTests/LispReaderTests.cs | 1789 +++++++++ .../LibTests/LockingTransactionTests.cs | 194 + .../Clojure.Tests/LibTests/MapEntryTests.cs | 369 ++ .../Clojure.Tests/LibTests/NamespaceTests.cs | 257 ++ .../Clojure/Clojure.Tests/LibTests/NumbersTests.cs | 137 + .../Clojure/Clojure.Tests/LibTests/ObjTests.cs | 68 + .../LibTests/PersistentArrayMapTests.cs | 917 +++++ .../LibTests/PersistentHashMapTests.cs | 242 ++ .../LibTests/PersistentHashSetTests.cs | 188 + .../Clojure.Tests/LibTests/PersistentListTests.cs | 245 ++ .../Clojure.Tests/LibTests/PersistentQueueTests.cs | 22 + .../LibTests/PersistentStructMapTests.cs | 22 + .../LibTests/PersistentTreeMapTests.cs | 233 ++ .../LibTests/PersistentTreeSetTests.cs | 58 + .../LibTests/PersistentVectorTests.cs | 330 ++ .../Clojure/Clojure.Tests/LibTests/RangeTests.cs | 182 + .../Clojure/Clojure.Tests/LibTests/RefTests.cs | 23 + .../Clojure.Tests/LibTests/RestFnImplTests.cs | 22 + .../Clojure/Clojure.Tests/LibTests/RestFnTests.cs | 22 + .../Clojure.Tests/LibTests/StreamSeqTests.cs | 22 + .../Clojure.Tests/LibTests/StringSeqTests.cs | 163 + .../Clojure/Clojure.Tests/LibTests/SymbolTests.cs | 326 ++ .../Clojure/Clojure.Tests/LibTests/TestTest.cs | 62 + .../Clojure.Tests/Properties/AssemblyInfo.cs | 36 + ClojureCLR/Clojure/Clojure/Bootstrap/ants.clj | 407 ++ .../Clojure/Clojure/Bootstrap/core-print.clj | 310 ++ ClojureCLR/Clojure/Clojure/Bootstrap/core.clj | 3969 ++++++++++++++++++++ ClojureCLR/Clojure/Clojure/Bootstrap/test.clj | 17 + ClojureCLR/Clojure/Clojure/Clojure.csproj | 184 + ClojureCLR/Clojure/Clojure/Compiler/Generator.cs | 2461 ++++++++++++ ClojureCLR/Clojure/Clojure/Lib/AFn.cs | 506 +++ ClojureCLR/Clojure/Clojure/Lib/AFnImpl.cs | 287 ++ ClojureCLR/Clojure/Clojure/Lib/AFunction.cs | 71 + ClojureCLR/Clojure/Clojure/Lib/AMapEntry.cs | 287 ++ ClojureCLR/Clojure/Clojure/Lib/APersistentMap.cs | 488 +++ ClojureCLR/Clojure/Clojure/Lib/APersistentSet.cs | 221 ++ .../Clojure/Clojure/Lib/APersistentVector.cs | 1004 +++++ ClojureCLR/Clojure/Clojure/Lib/ARef.cs | 200 + ClojureCLR/Clojure/Clojure/Lib/AReference.cs | 102 + ClojureCLR/Clojure/Clojure/Lib/ASeq.cs | 397 ++ ClojureCLR/Clojure/Clojure/Lib/Agent.cs | 402 ++ ClojureCLR/Clojure/Clojure/Lib/ArraySeq.cs | 205 + ClojureCLR/Clojure/Clojure/Lib/ArrayStream.cs | 22 + ClojureCLR/Clojure/Clojure/Lib/Associative.cs | 50 + ClojureCLR/Clojure/Clojure/Lib/Atom.cs | 198 + ClojureCLR/Clojure/Clojure/Lib/AtomicInteger.cs | 125 + ClojureCLR/Clojure/Clojure/Lib/AtomicLong.cs | 108 + ClojureCLR/Clojure/Clojure/Lib/AtomicReference.cs | 118 + ClojureCLR/Clojure/Clojure/Lib/Box.cs | 51 + ClojureCLR/Clojure/Clojure/Lib/CachedSeq.cs | 134 + ClojureCLR/Clojure/Clojure/Lib/ClojureException.cs | 34 + ClojureCLR/Clojure/Clojure/Lib/Compiler.cs | 325 ++ ClojureCLR/Clojure/Clojure/Lib/Cons.cs | 121 + ClojureCLR/Clojure/Clojure/Lib/Counted.cs | 29 + ClojureCLR/Clojure/Clojure/Lib/Delay.cs | 89 + ClojureCLR/Clojure/Clojure/Lib/Fn.cs | 25 + ClojureCLR/Clojure/Clojure/Lib/FnSeq.cs | 129 + ClojureCLR/Clojure/Clojure/Lib/FuncTypes.cs | 100 + ClojureCLR/Clojure/Clojure/Lib/IDeref.cs | 29 + ClojureCLR/Clojure/Clojure/Lib/IFn.cs | 77 + ClojureCLR/Clojure/Clojure/Lib/IMapEntry.cs | 41 + ClojureCLR/Clojure/Clojure/Lib/IMeta.cs | 29 + ClojureCLR/Clojure/Clojure/Lib/IObj.cs | 30 + .../Clojure/Clojure/Lib/IPersistentCollection.cs | 58 + ClojureCLR/Clojure/Clojure/Lib/IPersistentList.cs | 25 + ClojureCLR/Clojure/Clojure/Lib/IPersistentMap.cs | 68 + ClojureCLR/Clojure/Clojure/Lib/IPersistentSet.cs | 52 + ClojureCLR/Clojure/Clojure/Lib/IPersistentStack.cs | 35 + .../Clojure/Clojure/Lib/IPersistentVector.cs | 62 + ClojureCLR/Clojure/Clojure/Lib/IReduce.cs | 41 + ClojureCLR/Clojure/Clojure/Lib/IRef.cs | 78 + ClojureCLR/Clojure/Clojure/Lib/IReference.cs | 39 + ClojureCLR/Clojure/Clojure/Lib/ISeq.cs | 54 + ClojureCLR/Clojure/Clojure/Lib/IStream.cs | 29 + ClojureCLR/Clojure/Clojure/Lib/IndexedSeq.cs | 29 + ClojureCLR/Clojure/Clojure/Lib/IteratorStream.cs | 66 + .../Clojure/Lib/JavaConcurrentDictionary.cs | 79 + ClojureCLR/Clojure/Clojure/Lib/Keyword.cs | 206 + .../Clojure/Clojure/Lib/LazilyPersistentVector.cs | 200 + ClojureCLR/Clojure/Clojure/Lib/LazyCons.cs | 141 + ClojureCLR/Clojure/Clojure/Lib/LispReader.cs | 1115 ++++++ .../Clojure/Clojure/Lib/LockingTransaction.cs | 720 ++++ ClojureCLR/Clojure/Clojure/Lib/MapEntry.cs | 81 + ClojureCLR/Clojure/Clojure/Lib/MapEnumerator.cs | 127 + ClojureCLR/Clojure/Clojure/Lib/MultiFn.cs | 484 +++ ClojureCLR/Clojure/Clojure/Lib/Named.cs | 36 + ClojureCLR/Clojure/Clojure/Lib/Namespace.cs | 384 ++ ClojureCLR/Clojure/Clojure/Lib/Numbers.cs | 1737 +++++++++ ClojureCLR/Clojure/Clojure/Lib/Obj.cs | 78 + .../Clojure/Clojure/Lib/PersistentArrayMap.cs | 462 +++ .../Clojure/Clojure/Lib/PersistentHashMap.cs | 927 +++++ .../Clojure/Clojure/Lib/PersistentHashSet.cs | 152 + ClojureCLR/Clojure/Clojure/Lib/PersistentList.cs | 500 +++ ClojureCLR/Clojure/Clojure/Lib/PersistentQueue.cs | 367 ++ .../Clojure/Clojure/Lib/PersistentStructMap.cs | 518 +++ .../Clojure/Clojure/Lib/PersistentTreeMap.cs | 1244 ++++++ .../Clojure/Clojure/Lib/PersistentTreeSet.cs | 206 + ClojureCLR/Clojure/Clojure/Lib/PersistentVector.cs | 338 ++ .../Clojure/Clojure/Lib/Properties/AssemblyInfo.cs | 36 + ClojureCLR/Clojure/Clojure/Lib/RT.cs | 1507 ++++++++ ClojureCLR/Clojure/Clojure/Lib/Range.cs | 219 ++ ClojureCLR/Clojure/Clojure/Lib/Ratio.cs | 230 ++ ClojureCLR/Clojure/Clojure/Lib/Ref.cs | 603 +++ ClojureCLR/Clojure/Clojure/Lib/RestFn.cs | 1396 +++++++ ClojureCLR/Clojure/Clojure/Lib/RestFnImpl.cs | 551 +++ ClojureCLR/Clojure/Clojure/Lib/Reversible.cs | 29 + ClojureCLR/Clojure/Clojure/Lib/SeqEnumerator.cs | 110 + ClojureCLR/Clojure/Clojure/Lib/Sequential.cs | 25 + ClojureCLR/Clojure/Clojure/Lib/Settable.cs | 38 + ClojureCLR/Clojure/Clojure/Lib/Sorted.cs | 59 + ClojureCLR/Clojure/Clojure/Lib/StreamSeq.cs | 136 + ClojureCLR/Clojure/Clojure/Lib/Streamable.cs | 29 + ClojureCLR/Clojure/Clojure/Lib/StringSeq.cs | 138 + ClojureCLR/Clojure/Clojure/Lib/Symbol.cs | 295 ++ ClojureCLR/Clojure/Clojure/Lib/Util.cs | 185 + ClojureCLR/Clojure/Clojure/Lib/Var.cs | 839 +++++ .../Clojure/Clojure/Properties/AssemblyInfo.cs | 46 + .../Clojure/Properties/Resources.Designer.cs | 137 + .../Clojure/Clojure/Properties/Resources.resx | 133 + .../Clojure/Clojure/Readers/LineNumberingReader.cs | 165 + .../Clojure/Clojure/Runtime/ClojureBinder.cs | 39 + .../Clojure/Clojure/Runtime/ClojureCommandLine.cs | 36 + .../Clojure/Clojure/Runtime/ClojureContext.cs | 65 + .../Clojure/Clojure/Runtime/ClojureParser.cs | 74 + ClojureCLR/Clojure/Clojure/Runtime/Reflector.cs | 302 ++ ClojureCLR/Clojure/ClojureCLR.sln | 502 +++ 149 files changed, 40902 insertions(+) create mode 100644 ClojureCLR/Clojure/Clojure.Console/Clojure.Console.csproj create mode 100644 ClojureCLR/Clojure/Clojure.Console/ClojureConsole.cs create mode 100644 ClojureCLR/Clojure/Clojure.Console/Properties/AssemblyInfo.cs create mode 100644 ClojureCLR/Clojure/Clojure.Console/app.config create mode 100644 ClojureCLR/Clojure/Clojure.Tests/Clojure.Tests.csproj create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/AFnImplTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/APersistentVectorTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/ARefTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/AReferenceTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/AgentTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/ArraySeqTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/ArrayStreamTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/AtomTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/CachedSeqTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/ConsTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/DelayTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/FnSeqTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/IObjTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/ISeqTestHelper.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/IteratorStreamTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/KeywordTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/LazilyPersistentVectorTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/LazyConsTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/LispReaderTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/LockingTransactionTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/MapEntryTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/NamespaceTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/NumbersTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/ObjTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentArrayMapTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentHashMapTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentHashSetTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentListTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentQueueTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentStructMapTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentTreeMapTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentTreeSetTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/PersistentVectorTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/RangeTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/RefTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/RestFnImplTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/RestFnTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/StreamSeqTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/StringSeqTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/SymbolTests.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/LibTests/TestTest.cs create mode 100644 ClojureCLR/Clojure/Clojure.Tests/Properties/AssemblyInfo.cs create mode 100644 ClojureCLR/Clojure/Clojure/Bootstrap/ants.clj create mode 100644 ClojureCLR/Clojure/Clojure/Bootstrap/core-print.clj create mode 100644 ClojureCLR/Clojure/Clojure/Bootstrap/core.clj create mode 100644 ClojureCLR/Clojure/Clojure/Bootstrap/test.clj create mode 100644 ClojureCLR/Clojure/Clojure/Clojure.csproj create mode 100644 ClojureCLR/Clojure/Clojure/Compiler/Generator.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/AFn.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/AFnImpl.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/AFunction.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/AMapEntry.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/APersistentMap.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/APersistentSet.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/APersistentVector.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/ARef.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/AReference.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/ASeq.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Agent.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/ArraySeq.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/ArrayStream.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Associative.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Atom.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/AtomicInteger.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/AtomicLong.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/AtomicReference.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Box.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/CachedSeq.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/ClojureException.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Compiler.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Cons.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Counted.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Delay.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Fn.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/FnSeq.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/FuncTypes.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IDeref.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IFn.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IMapEntry.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IMeta.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IObj.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IPersistentCollection.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IPersistentList.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IPersistentMap.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IPersistentSet.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IPersistentStack.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IPersistentVector.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IReduce.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IRef.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IReference.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/ISeq.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IStream.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IndexedSeq.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/IteratorStream.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/JavaConcurrentDictionary.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Keyword.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/LazilyPersistentVector.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/LazyCons.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/LispReader.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/LockingTransaction.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/MapEntry.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/MapEnumerator.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/MultiFn.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Named.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Namespace.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Numbers.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Obj.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentArrayMap.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentHashMap.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentHashSet.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentList.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentQueue.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentStructMap.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentTreeMap.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentTreeSet.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/PersistentVector.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Properties/AssemblyInfo.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/RT.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Range.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Ratio.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Ref.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/RestFn.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/RestFnImpl.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Reversible.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/SeqEnumerator.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Sequential.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Settable.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Sorted.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/StreamSeq.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Streamable.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/StringSeq.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Symbol.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Util.cs create mode 100644 ClojureCLR/Clojure/Clojure/Lib/Var.cs create mode 100644 ClojureCLR/Clojure/Clojure/Properties/AssemblyInfo.cs create mode 100644 ClojureCLR/Clojure/Clojure/Properties/Resources.Designer.cs create mode 100644 ClojureCLR/Clojure/Clojure/Properties/Resources.resx create mode 100644 ClojureCLR/Clojure/Clojure/Readers/LineNumberingReader.cs create mode 100644 ClojureCLR/Clojure/Clojure/Runtime/ClojureBinder.cs create mode 100644 ClojureCLR/Clojure/Clojure/Runtime/ClojureCommandLine.cs create mode 100644 ClojureCLR/Clojure/Clojure/Runtime/ClojureContext.cs create mode 100644 ClojureCLR/Clojure/Clojure/Runtime/ClojureParser.cs create mode 100644 ClojureCLR/Clojure/Clojure/Runtime/Reflector.cs create mode 100644 ClojureCLR/Clojure/ClojureCLR.sln (limited to 'ClojureCLR/Clojure') diff --git a/ClojureCLR/Clojure/Clojure.Console/Clojure.Console.csproj b/ClojureCLR/Clojure/Clojure.Console/Clojure.Console.csproj new file mode 100644 index 00000000..eeaf5a07 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Console/Clojure.Console.csproj @@ -0,0 +1,82 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {4AFFC540-543E-4F56-9F49-14210D6C143A} + Exe + Properties + Clojure.Console + Clojure.Console + v3.5 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + {2AE75F5A-CD1F-4925-9647-AF4D1C282FB4} + Microsoft.Scripting.Core + + + {8B0F1074-750E-4D64-BF23-A1E0F54261E5} + Microsoft.Scripting.ExtensionAttribute + + + {EB66B766-6354-4208-A3D4-AACBDCB5C3B3} + Microsoft.Scripting + + + {B8089F66-DFBD-4906-BEE0-B317689C2524} + Clojure + + + + + + + + \ No newline at end of file diff --git a/ClojureCLR/Clojure/Clojure.Console/ClojureConsole.cs b/ClojureCLR/Clojure/Clojure.Console/ClojureConsole.cs new file mode 100644 index 00000000..f0f88869 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Console/ClojureConsole.cs @@ -0,0 +1,217 @@ +/** + * Copyright (c) David Miller. All rights reserved. + * The use and distribution terms for this software are covered by the + * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) + * which can be found in the file epl-v10.html at the root of this distribution. + * By using this software in any fashion, you are agreeing to be bound by + * the terms of this license. + * You must not remove this notice, or any other, from this software. + **/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Scripting.Hosting.Shell; +using clojure.lang; +using System.IO; +using Microsoft.Linq.Expressions; +using Microsoft.Scripting.Generation; +using Microsoft.Scripting; +using Microsoft.Scripting.Runtime; +using Microsoft.Scripting.Hosting; +using Microsoft.Scripting.Hosting.Providers; +using System.Diagnostics; +using System.Resources; +using System.Threading; + + +using clojure.runtime; +using clojure.compiler; + + +namespace clojure.console +{ + class ClojureConsole : ConsoleHost, Compiler.EEHooks + { + #region Data + + private bool _isInitialized = false; + + #endregion + + #region Convenience accessors + + private ClojureContext GetLanguageContext() + { + return (ClojureContext)HostingHelpers.GetLanguageContext(Engine); + } + + + private static SourceUnit GetSourceUnit(ScriptSource scriptSource) + { + return HostingHelpers.GetSourceUnit(scriptSource); + } + + #endregion + + #region Basic overrides + + protected override Type Provider + { + get + { + return typeof(ClojureContext); + } + } + + protected override CommandLine CreateCommandLine() + { + return new ClojureCommandLine(); + } + + #endregion + + #region Main routine + + [STAThread] + static int Main(string[] args) + { + ClojureConsole cc = new ClojureConsole(); + + int ret = cc.Run(args); + + Console.ReadLine(); + return ret; + } + + #endregion + + #region Execution override + + protected override void ExecuteInternal() + { + Debug.Assert(Engine != null); + + Var.pushThreadBindings( + RT.map(RT.CURRENT_NS, RT.CURRENT_NS.deref())); + try + { + Snippets.SetSaveAssemblies(true, "."); + MaybeInitialize(); + Snippets.SaveAndVerifyAssemblies(); + base.ExecuteInternal(); + } + catch (Exception e) + { + UnhandledException(Engine, e); + } + + finally + { + Snippets.SaveAndVerifyAssemblies(); + Var.popThreadBindings(); + } + } + + + #endregion + + #region Initialization + + private void MaybeInitialize() + { + if (_isInitialized) + return; + + _isInitialized = true; + + Compiler.SetHooks(this); + + Stopwatch sw = new Stopwatch(); + sw.Start(); + + LoadFromStream(new StringReader(clojure.properties.Resources.core)); + LoadFromStream(new StringReader(clojure.properties.Resources.core_print)); + LoadFromStream(new StringReader(clojure.properties.Resources.test)); + + sw.Stop(); + Console.WriteLine("Loading took {0} milliseconds.", sw.ElapsedMilliseconds); + + + } + + #endregion + + #region EEHooks Members + + public object Eval(object form) + { + ScriptSource scriptSource = Engine.CreateScriptSourceFromString(""); + + Expression expr = Generator.Eval(GetLanguageContext(), form); + LambdaExpression ast = Expression.Lambda(expr); + ast = new GlobalLookupRewriter().RewriteLambda(ast); + ScriptCode code = new ScriptCode(ast, GetSourceUnit(scriptSource)); + return code.Run(); + } + + public object Macroexpand1(object form) + { + return Generator.Macroexpand1(GetLanguageContext(), form); + } + + public object LoadFromStream(TextReader rdr) + { + ScriptSource scriptSource = Engine.CreateScriptSourceFromString(""); + //PushbackReader pbr = new PushbackReader(rdr); + + return LoadFromPushbackReader(scriptSource, rdr, false); + } + + public object LoadFile(string filename) + { + ScriptSource scriptSource = Engine.CreateScriptSourceFromFile(filename); + + return LoadFromPushbackReader(scriptSource, scriptSource.GetReader(), false); + } + + private static object LoadFromPushbackReader(ScriptSource scriptSource, TextReader pbr, bool addPrint) + { + object ret = null; + object eofVal = new object(); + object form; + while ((form = LispReader.read(pbr, false, eofVal, false)) != eofVal) + { + LambdaExpression ast = Generator.Generate(form, addPrint); + ast = new GlobalLookupRewriter().RewriteLambda(ast); + + ScriptCode code = new ScriptCode(ast, GetSourceUnit(scriptSource)); + ret = code.Run(); + } + + return ret; + } + + public Delegate GenerateTypedDelegate(Type delegateType, Symbol optName, IPersistentVector argList, ISeq body) + { + ScriptSource scriptSource = Engine.CreateScriptSourceFromString(""); + + LambdaExpression ast = Generator.GenerateTypedDelegateExpression(GetLanguageContext(), delegateType, optName, argList, body); + return ast.Compile(); + + //ast = new GlobalLookupRewriter().RewriteLambda(ast); -- doesn't work unless no args + //ScriptCode code = new ScriptCode(ast, GetSourceUnit(scriptSource)); + //return code; + } + + #endregion + + protected override ScriptRuntimeSetup CreateRuntimeSetup() + { + ScriptRuntimeSetup setup = base.CreateRuntimeSetup(); + setup.DebugMode = true; + return setup; + } + } +} diff --git a/ClojureCLR/Clojure/Clojure.Console/Properties/AssemblyInfo.cs b/ClojureCLR/Clojure/Clojure.Console/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..6f21300e --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Console/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Clojure.Console")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Clojure.Console")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("64eccb33-4ad4-49b4-944c-ff486ccb5ea0")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ClojureCLR/Clojure/Clojure.Console/app.config b/ClojureCLR/Clojure/Clojure.Console/app.config new file mode 100644 index 00000000..b7db2817 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Console/app.config @@ -0,0 +1,3 @@ + + + diff --git a/ClojureCLR/Clojure/Clojure.Tests/Clojure.Tests.csproj b/ClojureCLR/Clojure/Clojure.Tests/Clojure.Tests.csproj new file mode 100644 index 00000000..9bf437a0 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Tests/Clojure.Tests.csproj @@ -0,0 +1,121 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {656E1517-B0CA-47B4-B068-3DF43DC41F8A} + Library + Properties + Clojure.Tests + Clojure.Tests + v3.5 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\..\dev\RhinoMocks\Castle.Core.dll + + + False + ..\..\..\..\dev\RhinoMocks\Castle.DynamicProxy2.dll + + + + False + ..\..\..\..\dev\RhinoMocks\Rhino.Mocks.dll + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {B8089F66-DFBD-4906-BEE0-B317689C2524} + Clojure + + + + + \ No newline at end of file diff --git a/ClojureCLR/Clojure/Clojure.Tests/LibTests/AFnImplTests.cs b/ClojureCLR/Clojure/Clojure.Tests/LibTests/AFnImplTests.cs new file mode 100644 index 00000000..3c79b69b --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Tests/LibTests/AFnImplTests.cs @@ -0,0 +1,22 @@ +/** + * Copyright (c) David Miller. All rights reserved. + * The use and distribution terms for this software are covered by the + * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) + * which can be found in the file epl-v10.html at the root of this distribution. + * By using this software in any fashion, you are agreeing to be bound by + * the terms of this license. + * You must not remove this notice, or any other, from this software. + **/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Clojure.Tests.LibTests +{ + // TODO: Add AFnImpl tests + class AFnImplTests + { + } +} diff --git a/ClojureCLR/Clojure/Clojure.Tests/LibTests/APersistentVectorTests.cs b/ClojureCLR/Clojure/Clojure.Tests/LibTests/APersistentVectorTests.cs new file mode 100644 index 00000000..88213a02 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Tests/LibTests/APersistentVectorTests.cs @@ -0,0 +1,707 @@ +/** + * Copyright (c) David Miller. All rights reserved. + * The use and distribution terms for this software are covered by the + * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) + * which can be found in the file epl-v10.html at the root of this distribution. + * By using this software in any fashion, you are agreeing to be bound by + * the terms of this license. + * You must not remove this notice, or any other, from this software. + **/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using NUnit.Framework; +using Rhino.Mocks; + +using clojure.lang; + +using RMExpect = Rhino.Mocks.Expect; + + +namespace Clojure.Tests.LibTests +{ + + // TODO: Add tests for APersistentVector.SubVector + // TODO: Add tests for APersistentVector.stream + + [TestFixture] + public class APersistentVectorTests : AssertionHelper + { + + // Usually, we test the abstract classes via the simplest concrete class that derives from it. + // For APersistentVector, all the concrete classes are fairly complicated. + // Hence we create a test concrete implementation class. + // This class has no guarantees of persistence/immutability, thread-safety, + // or much of anything else, certainly not efficiency. + // We determined the methods to override by trying to compile the class with no methods. + // Thus, we have implemented only the absolute minimum. + // We will write tests for these methods, too. + // This class just has an underlying List to hold values. + class CPV : APersistentVector + { + object[] _values; + + public CPV(object[] values) + : base(null) + { + _values = values; + } + + + public CPV(IPersistentMap meta, object[] values) + : base(meta) + { + _values = values; + } + + public override IObj withMeta(IPersistentMap meta) + { + return meta == _meta + ? this + : new CPV(meta, _values); + } + + //public override object applyTo(ISeq arglist) + //{ + // throw new NotImplementedException(); + //} + + public override IPersistentStack pop() + { + if (_values.Length == 0) + throw new InvalidOperationException("Can't pop a null stack."); + + object[] newArr = new object[_values.Length - 1]; + Array.Copy(_values, newArr, _values.Length - 1); + + return new CPV(_meta, newArr); + } + + public override IPersistentVector cons(object o) + { + object[] newArr = new object[_values.Length + 1]; + _values.CopyTo(newArr, 0); + newArr[_values.Length] = o; + return new CPV(_meta, newArr); + } + + public override IPersistentVector assocN(int i, object val) + { + if ( 0 <= i && i < _values.Length ) + { + object[] newArr = new object[_values.Length]; + _values.CopyTo(newArr, 0); + newArr[i] = val; + return new CPV(_meta, newArr); + } + if ( i == _values.Length ) + return cons(val); + throw new IndexOutOfRangeException(); + } + + public override object nth(int i) + { + return _values[i]; + } + + public override int length() + { + return _values.Length; + } + + private static CPV EMPTY = new CPV(new object[0]); + public override IPersistentCollection empty() + { + return EMPTY; + } + + public override int count() + { + return _values.Length; + } + } + + #region C-tor tests + + [Test] + public void NoMetaCtorHasNoMeta() + { + CPV v = new CPV(new object[] { 1, 2, 3 }); + + Expect(v.meta(),Null); + } + + [Test] + public void MetaCtorHasMeta() + { + MockRepository mocks = new MockRepository(); + IPersistentMap meta = mocks.StrictMock(); + mocks.ReplayAll(); + + CPV v = new CPV(meta,new object[] { 1, 2, 3 }); + + Expect(v.meta(), SameAs(meta)); + mocks.VerifyAll(); + } + + #endregion + + #region Object tests + + [Test] + public void ToStringMentionsTheCount() + { + CPV v = new CPV(new object[] { 1, 2, 3 }); + string str = v.ToString(); + + Expect(str.Contains("3")); + } + + [Test] + public void HashCodeRepeats() + { + CPV v = new CPV(new object[] { 1, 2, 3 }); + + Expect(v.GetHashCode(), EqualTo(v.GetHashCode())); + } + + [Test] + public void HashCodeDependsOnItems() + { + CPV v1 = new CPV(new object[] { 1, 2, 3 }); + CPV v2 = new CPV(new object[] { 1, 2, 4 }); + + Expect(v1.GetHashCode(), Not.EqualTo(v2.GetHashCode())); + } + + [Test] + public void EqualsOnNonPersistentVectorIsFalse() + { + CPV v1 = new CPV(new object[] { 1, 2, 3 }); + + Expect(v1.equiv(7), False); + } + + [Test] + public void EqualsOnPersistentVectorWithDifferentItemsIsFalse() + { + CPV v1 = new CPV(new object[] { 1, 2, 3 }); + CPV v2 = new CPV(new object[] { 1, 2, 4 }); + CPV v3 = new CPV(new object[] { 1, 2 }); + CPV v4 = new CPV(new object[] { 1, 2, 3, 4 }); + + Expect(v1.equiv(v2), False); + Expect(v1.equiv(v3), False); + Expect(v1.equiv(v4), False); + } + + [Test] + public void EqualsOnPersistentVectorWithSameItemsIsTrue() + { + CPV v1 = new CPV(new object[] { 1, 2, 3 }); + CPV v2 = new CPV(new object[] { 1, 2, 3 }); + CPV v3 = new CPV(new object[] { 1 }); + CPV v4 = new CPV(new object[] { 1 }); + CPV v5 = new CPV(new object[] { }); + CPV v6 = new CPV(new object[] { }); + + Expect(v1.equiv(v2)); + Expect(v3.equiv(v4)); + Expect(v5.equiv(v6)); + } + + [Test] + public void EqualsOnSimilarISeqWorks() + { + CPV v1 = new CPV(new object[] { 'a', 'b', 'c' }); + StringSeq s1 = StringSeq.create("abc"); + + Expect(v1.equiv(s1)); + } + + [Test] + public void EqualsOnDissimilarISeqFails() + { + CPV v1 = new CPV(new object[] { 'a', 'b', 'c' }); + StringSeq s1 = StringSeq.create("ab"); + StringSeq s2 = StringSeq.create("abd"); + StringSeq s3 = StringSeq.create("abcd"); + + Expect(v1.equiv(s1), False); + Expect(v1.equiv(s2), False); + Expect(v1.equiv(s3), False); + } + + + #endregion + + #region IFn tests + + [Test] + public void InvokeCallsNth() + { + CPV v = new CPV(new object[] { 5, 6, 7 }); + + Expect(v.invoke(0),EqualTo(5)); + Expect(v.invoke(1),EqualTo(6)); + Expect(v.invoke(2),EqualTo(7)); + Expect(v.invoke("1"), EqualTo(6)); + Expect(v.invoke(1.0), EqualTo(6)); + Expect(v.invoke(1.2), EqualTo(6)); + Expect(v.invoke(1.8), EqualTo(6)); // Rounds or not-- should it? + Expect(v.invoke(1.4M), EqualTo(6)); + } + + + #endregion + + #region IPersistentCollection tests + + [Test] + public void SeqOnCount0YieldsNull() + { + CPV v = new CPV(new object[0]); + + Expect(v.seq(), Null); + } + + [Test] + public void SeqOnPositiveCountYieldsNotNull() + { + CPV v = new CPV(new object[]{ 1,2,3}); + + Expect(v.seq(), Not.Null); + } + + [Test] + public void SeqOnPositiveCountYieldsValidSequence() + { + CPV v = new CPV(new object[] { 1, 2, 3 }); + ISeq s = v.seq(); + + Expect(s.first(), EqualTo(1)); + Expect(s.rest().first(), EqualTo(2)); + Expect(s.rest().rest().first(), EqualTo(3)); + Expect(s.rest().rest().rest(), Null); + } + + [Test] + public void Explicit_IPersistentCollection_cons_works() + { + CPV v = new CPV(new object[] { 1, 2 }); + IPersistentCollection c = v as IPersistentCollection; + + Expect(c, Not.Null); + + IPersistentCollection c2 = c.cons(3); + Expect(c2.count(), EqualTo(3)); + + ISeq s2 = c2.seq(); + + Expect(s2.first(), EqualTo(1)); + Expect(s2.rest().first(), EqualTo(2)); + Expect(s2.rest().rest().first(), EqualTo(3)); + Expect(s2.rest().rest().rest(), Null); + } + + #endregion + + #region Reversible tests + + [Test] + public void RseqOnCount0YieldsNull() + { + CPV v = new CPV(new object[0]); + + Expect(v.rseq(), Null); + } + + [Test] + public void RSeqOnPositiveCountYieldsNotNull() + { + CPV v = new CPV(new object[] { 1, 2, 3 }); + + Expect(v.rseq(), Not.Null); + } + + [Test] + public void RseqOnPositiveCountYieldsValidSequence() + { + CPV v = new CPV(new object[] { 1, 2, 3 }); + ISeq s = v.rseq(); + + Expect(s.first(), EqualTo(3)); + Expect(s.rest().first(), EqualTo(2)); + Expect(s.rest().rest().first(), EqualTo(1)); + Expect(s.rest().rest().rest(), Null); + } + + + #endregion + + #region Associative tests + + [Test] + public void ContainsKeyOnNonNumericIsFalse() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + Expect(v.containsKey("a"), False); + } + + [Test] + public void ContainsKeyOnIndexInRangeIsTrue() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + Expect(v.containsKey(1.2)); + } + + + [Test] + public void ContainsKeyOnIndexOutOfRangeIsFalse() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + Expect(v.containsKey(5),False); + } + + [Test] + public void EntryAtOnNonNumericReturnsNull() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + IMapEntry me = v.entryAt("a"); + + Expect(me, Null); + } + + [Test] + public void EntryAtOnIndexInRangeReturnsEntry() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + IMapEntry me = v.entryAt(1); + + Expect(me.key(), EqualTo(1)); + Expect(me.val(),EqualTo(5)); + } + + + [Test] + public void EntryAtOnIndexOutOfRangeReturnsNull() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + IMapEntry me = v.entryAt(5); + + Expect(me, Null); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void AssocWithNonNumericKeyThrowsException() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + Associative a = v.assoc("a", 7); + } + + [Test] + public void AssocWithNumericKeyInRangeChangesValue() + { + //This just checks that APersistentVector.assoc calls CPV.assocN + CPV v = new CPV(new object[] { 4, 5, 6 }); + Associative a = v.assoc(1, 10); + + Expect(a.valAt(0), EqualTo(4)); + Expect(a.valAt(1), EqualTo(10)); + Expect(a.valAt(2), EqualTo(6)); + Expect(a.count(), EqualTo(3)); + } + + [Test] + public void AssocWithNumericKeyOnePastEndAddValue() + { + //This just checks that APersistentVector.assoc calls CPV.assocN + CPV v = new CPV(new object[] { 4, 5, 6 }); + Associative a = v.assoc(3, 10); + + Expect(a.valAt(0), EqualTo(4)); + Expect(a.valAt(1), EqualTo(5)); + Expect(a.valAt(2), EqualTo(6)); + Expect(a.valAt(3), EqualTo(10)); + Expect(a.count(), EqualTo(4)); + } + + [Test] + [ExpectedException(typeof(IndexOutOfRangeException))] + public void AssocWithNumericKeyOutOfRangeHighThrowsException() + { + //This just checks that APersistentVector.assoc calls CPV.assocN + CPV v = new CPV(new object[] { 4, 5, 6 }); + Associative a = v.assoc(4, 10); + } + + [Test] + [ExpectedException(typeof(IndexOutOfRangeException))] + public void AssocWithNumericKeyOutOfRangeLowThrowsException() + { + //This just checks that APersistentVector.assoc calls CPV.assocN + CPV v = new CPV(new object[] { 4, 5, 6 }); + Associative a = v.assoc(-1, 10); + } + + [Test] + public void ValAtOnNonNumericReturnsDefault() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + object val1 = v.valAt("a"); + object val2 = v.valAt("a", "abc"); + + Expect(val1, Null); + Expect(val2, EqualTo("abc")); + } + + [Test] + public void ValAtOnIndexInRangeReturnsEntry() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + object val1 = v.valAt(1); + object val2 = v.valAt(1, "abc"); + + Expect(val1, EqualTo(5)); + Expect(val2, EqualTo(5)); + } + + + [Test] + public void ValAtOnIndexOutOfRangeReturnsDefault() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + + IMapEntry me = v.entryAt(5); + + object val1 = v.valAt(4); + object val2 = v.valAt(4, "abc"); + + Expect(val1, Null); + Expect(val2, EqualTo("abc")); + } + + + + #endregion + + #region IPersistentStack tests + + [Test] + public void PeekOnCount0ReturnsNull() + { + CPV v = new CPV(new object[] {}); + + Expect(v.peek(), Null); + } + + [Test] + public void PeekOnPositiveCountReturnsLastItem() + { + CPV v = new CPV(new object[] { 1, 2, 3 }); + + Expect(v.peek(), EqualTo(3)); + } + + #endregion + + #region APersistentVector.Seq tests + + // We'll do all the tests indirectly. + + [Test] + public void SeqFirstAndRestWork() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + ISeq s = v.seq(); + + Expect(s.first(), EqualTo(4)); + Expect(s.rest().first(), EqualTo(5)); + Expect(s.rest().rest().first(), EqualTo(6)); + Expect(s.rest().rest().rest(), Null); + } + + [Test] + public void SeqIndexedWorks() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + ISeq s0 = v.seq(); + IndexedSeq i0 = s0 as IndexedSeq; + + ISeq s1 = s0.rest(); + IndexedSeq i1 = s1 as IndexedSeq; + + Expect(i0.index(), EqualTo(0)); + Expect(i1.index(), EqualTo(1)); + } + + [Test] + public void SeqCountWorks() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + ISeq s = v.seq(); + + Expect(s.count(), EqualTo(3)); + Expect(s.rest().count(), EqualTo(2)); + Expect(s.rest().rest().count(), EqualTo(1)); + } + + [Test] + public void SeqWithMetaHasMeta() + { + MockRepository mocks = new MockRepository(); + IPersistentMap meta = mocks.StrictMock(); + mocks.ReplayAll(); + + CPV v = new CPV(new object[] { 4, 5, 6 }); + IObj s = (IObj)v.seq(); + IObj obj = s.withMeta(meta); + + Expect(obj.meta(), SameAs(meta)); + mocks.VerifyAll(); + } + + [Test] + public void SeqReduceWithNoStartIterates() + { + MockRepository mocks = new MockRepository(); + IFn fn = mocks.StrictMock(); + RMExpect.Call(fn.invoke(1, 2)).Return(5); + RMExpect.Call(fn.invoke(5, 3)).Return(7); + mocks.ReplayAll(); + + CPV v = new CPV(new object[] { 1, 2, 3 }); + IReduce r = (IReduce)v.seq(); + object ret = r.reduce(fn); + + Expect(ret, EqualTo(7)); + mocks.VerifyAll(); + } + + [Test] + public void SeqReduceWithStartIterates() + { + MockRepository mocks = new MockRepository(); + IFn fn = mocks.StrictMock(); + RMExpect.Call(fn.invoke(20, 1)).Return(10); + RMExpect.Call(fn.invoke(10, 2)).Return(5); + RMExpect.Call(fn.invoke(5, 3)).Return(7); + mocks.ReplayAll(); + + CPV v = new CPV(new object[] { 1, 2, 3 }); + IReduce r = (IReduce)v.seq(); + object ret = r.reduce(fn, 20); + + Expect(ret, EqualTo(7)); + mocks.VerifyAll(); + } + + #endregion + + #region APersistentVector.RSeq tests + + // We'll do all the tests indirectly. + + [Test] + public void RSeqFirstAndRestWork() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + ISeq s = v.rseq(); + + Expect(s.first(), EqualTo(6)); + Expect(s.rest().first(), EqualTo(5)); + Expect(s.rest().rest().first(), EqualTo(4)); + Expect(s.rest().rest().rest(), Null); + } + + [Test] + public void RSeqIndexedWorks() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + ISeq s0 = v.rseq(); + IndexedSeq i0 = s0 as IndexedSeq; + + ISeq s1 = s0.rest(); + IndexedSeq i1 = s1 as IndexedSeq; + + Expect(i0.index(), EqualTo(0)); + Expect(i1.index(), EqualTo(1)); + } + + [Test] + public void RSeqCountWorks() + { + CPV v = new CPV(new object[] { 4, 5, 6 }); + ISeq s = v.rseq(); + + Expect(s.count(), EqualTo(3)); + Expect(s.rest().count(), EqualTo(2)); + Expect(s.rest().rest().count(), EqualTo(1)); + } + + [Test] + public void RSeqWithMetaHasMeta() + { + MockRepository mocks = new MockRepository(); + IPersistentMap meta = mocks.StrictMock(); + mocks.ReplayAll(); + + CPV v = new CPV(new object[] { 4, 5, 6 }); + IObj s = (IObj)v.rseq(); + IObj obj = s.withMeta(meta); + + Expect(obj.meta(), SameAs(meta)); + mocks.VerifyAll(); + } + + [Test] + public void RSeqReduceWithNoStartIterates() + { + MockRepository mocks = new MockRepository(); + IFn fn = mocks.StrictMock(); + RMExpect.Call(fn.invoke(3, 2)).Return(5); + RMExpect.Call(fn.invoke(5, 1)).Return(7); + mocks.ReplayAll(); + + CPV v = new CPV(new object[] { 1, 2, 3 }); + IReduce r = (IReduce)v.rseq(); + object ret = r.reduce(fn); + + Expect(ret, EqualTo(7)); + mocks.VerifyAll(); + } + + [Test] + public void RSeqReduceWithStartIterates() + { + MockRepository mocks = new MockRepository(); + IFn fn = mocks.StrictMock(); + RMExpect.Call(fn.invoke(20, 3)).Return(10); + RMExpect.Call(fn.invoke(10, 2)).Return(5); + RMExpect.Call(fn.invoke(5, 1)).Return(7); + mocks.ReplayAll(); + + CPV v = new CPV(new object[] { 1, 2, 3 }); + IReduce r = (IReduce)v.rseq(); + object ret = r.reduce(fn, 20); + + Expect(ret, EqualTo(7)); + mocks.VerifyAll(); + } + + #endregion + + } +} diff --git a/ClojureCLR/Clojure/Clojure.Tests/LibTests/ARefTests.cs b/ClojureCLR/Clojure/Clojure.Tests/LibTests/ARefTests.cs new file mode 100644 index 00000000..c2cbe01e --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Tests/LibTests/ARefTests.cs @@ -0,0 +1,22 @@ +/** + * Copyright (c) David Miller. All rights reserved. + * The use and distribution terms for this software are covered by the + * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) + * which can be found in the file epl-v10.html at the root of this distribution. + * By using this software in any fashion, you are agreeing to be bound by + * the terms of this license. + * You must not remove this notice, or any other, from this software. + **/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Clojure.Tests.LibTests +{ + // TODO: Add tests for Aref + class ARefTests + { + } +} diff --git a/ClojureCLR/Clojure/Clojure.Tests/LibTests/AReferenceTests.cs b/ClojureCLR/Clojure/Clojure.Tests/LibTests/AReferenceTests.cs new file mode 100644 index 00000000..8f621ae2 --- /dev/null +++ b/ClojureCLR/Clojure/Clojure.Tests/LibTests/AReferenceTests.cs @@ -0,0 +1,98 @@ +/** + * Copyright (c) David Miller. All rights reserved. + * The use and distribution terms for this software are covered by the + * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) + * which can be found in the file epl-v10.html at the root of this distribution. + * By using this software in any fashion, you are agreeing to be bound by + * the terms of this license. + * You must not remove this notice, or any other, from this software. + **/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using NUnit.Framework; +using Rhino.Mocks; + +using clojure.lang; + +using RMExpect = Rhino.Mocks.Expect; + +namespace Clojure.Tests.LibTests +{ + + [TestFixture] + public class AReferenceTests : AssertionHelper + { + // AReference is abstract. We need a class to instantiate. + + class ConcreteAReference : AReference + { + public ConcreteAReference() : base() { } + public ConcreteAReference(IPersistentMap meta) : base(meta) { } + } + + + #region C-tor tests + + [Test] + public void Default_ctor_creates_with_null_metadata() + { + ConcreteAReference c = new ConcreteAReference(); + Expect(c.meta(), Null); + } + + [Test] + public void Map_ctor_creates_with_given_metadata() + { + MockRepository mocks = new MockRepository(); + IPersistentMap meta = mocks.StrictMock(); + mocks.ReplayAll(); + + ConcreteAReference c = new ConcreteAReference(meta); + Expect(c.meta(), EqualTo(meta)); + + mocks.VerifyAll(); +