Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'web/mono-contribution-howto')
-rw-r--r--web/mono-contribution-howto551
1 files changed, 0 insertions, 551 deletions
diff --git a/web/mono-contribution-howto b/web/mono-contribution-howto
deleted file mode 100644
index ea3a4eaae53..00000000000
--- a/web/mono-contribution-howto
+++ /dev/null
@@ -1,551 +0,0 @@
-
- <Mono newbie coders start file>
- <h1> A little help for mono newbie coders </h1>
-
-
- For those who are new to Mono and are impatient to contribute
- with code (uhh... you are brave!!) here is the document you
- should read.
-
-
- You will see all Mono hackers say the same (great minds have
- similar way of thinking): First, DO WRITE TESTS!!!. In order
- to do that:
-
- <ul>
- * Start with the NUnit Tests Guidelines. In the cvs
- they are located at: mcs/class/doc/NUnitGuideli...
-
- * But wait, this is a document for impatient
- people. So EVERYTHING should be here. Well, it is.
- </ul>
-
-
- <h2> The NUnit Tests Guidelines document </h2>
-
- Mono NUnit Test Guidelines and Best Practices
-
- Authors: Nick Drochak <ndrochak@gol.com>
- Martin Baulig <martin@gnome.org>
- Last Update: 2002-03-02
- Rev: 0.3
-
- <b> Purpose </b>
-
- This document captures all the good ideas people have had
- about writing NUnit tests for the mono project. This document
- will be useful for anyone who writes or maintains unit tests.
-
- <b> Other resources </b>
-
- - mcs/class/README has an explanation of the build process and
- how it relates to the tests.
- - http://nunit.sourceforge.net is the place to find out about
- NUnit
-
- <b> Getting Started </b>
-
- If you are new to writing NUnit tests, there is a template
- you may use to help get started. The file is:
-
- mcs/class/doc/TemplateTest.cs
-
-
- (2.- This is the point two!. This file is just after the end
- of the guidelines. Copy/paste it in another buffer. And keep
- reading.)
-
- Save a copy of this file in the appropriate test subdirecty
- (see below), and replace all the [text] markers with
- appropriate code. Comments in the template are there to guide
- you. You should also look at existing tests to see how other
- people have written them.
-
- mcs/class/corlib/Test/System.Collections/CollectionBaseTest.cs
-
- is a small one that might help.
-
- (3.- You reached the third point. And as expected, it's just
- here to tell you that the content of CollectionBaseTest.cs is
- after the TemplateTest.cs code at the end of these
- guidelines.)
-
- The directory that will contain your new file depends on the
- assembly/namespace of the class for which you are creating the
- tests. Under mcs/class there is a directory for each assembly.
- In each assembly there is a Test directory, e.g.
- mcs/class/corlib/Test. In the Test directory there are
- sub-directories for each namespace in the assembly, e.g.
- mcs/class/corlib/Test/Sytem. Put your new test file in the
- appropriate sub-directory under Test for the class you are
- testing.
-
- Once your test class is complete, you need to add it to the
- AllTests.cs file in the same directory as your new test. Add a
- call to "suite.AddTest()" passing the name of your new test
- class's suite property as the parameter. You will see examples
- in the AllTests.cs file, so just copy and paste inside there.
-
- Once all of that is done, you can do a 'make test' from the top
- mcs directory. Your test class will be automagically included
- in the build and the tests will be run along with all the
- others.
-
- <b> Tips </b>
-
- <b> Provide an unique error message for Assert() </b>
-
- Include an unique message for each Assert() so that when the
- assert fails, it is trivial to locate the failing one.
- Otherwise, it may be difficult to determine which part of the
- test is failing. A good way to ensure unique messages is to use
- something like #A01, #A02 etc.
-
- Bad:
-<pre>
- AssertEquals("array match", compare[0], i1[0]);
- AssertEquals("array match", compare[1], i1[1]);
- AssertEquals("array match", compare[2], i1[2]);
- AssertEquals("array match", compare[3], i1[3]);
-</pre>
- Good:
-<pre>
- AssertEquals("#A01", compare[0], i1[0]);
- AssertEquals("#A02", compare[1], i1[1]);
- AssertEquals("#A03", compare[2], i1[2]);
- AssertEquals("#A04", compare[3], i1[3]);
-</pre>
- Once you used such a number in an Assert(), don't change it
- later on - people might use it it identify the test in bug
- reports or in mailing lists.
-
- <b> Use AssertEquals() to compare things, not Assert(). </b>
-
- Never compare two values with Assert() - if the test fails,
- people have no idea what went wrong while AssertEquals()
- reports the failed value.
-
- Bad:
-<pre>
- Assert ("A01", myTicks[0] == t1.Ticks);
-</pre>
- Good:
-<pre>
- AssertEquals ("A01", myTicks[0], t1.Ticks);
-</pre>
-
- <b> Constructors </b>
-
- When writing your testcase, please make sure to provide a
- constructor which takes no arguments:
-
-<pre>
- public class DateTimeTest : TestCase
- {
-
- public DateTimeTest() : base ("[MonoTests.System.DateTimeTest]") {}
- public DateTimeTest (string name): base(name) {}
-
- public static ITest Suite
- {
- get {
- TestSuite suite = new TestSuite ();
- return suite;
- }
- }
- }
-</pre>
-
- <b> Namespace </b>
-
- Please keep the namespace within each test directory
- consistent - all tests which are referenced in the same
- AllTests.cs must be in the same namespace. Of course you can
- use subnamespaces as you like - especially for subdirectories
- of your testsuite.
-
- For instance, if your AllTests.cs is in namespace "MonoTests"
- and you have a subdirectory called "System", you can put all
- the tests in that dir into namespace "MonoTests.System".
-
- <b> Test your test with the microsoft runtime </b>
-
- If possible, try to run your testsuite with the Microsoft
- runtime on Windows and make sure all tests in it pass. This is
- especially important if you're writing a totally new testcase
- - without this check you can never be sure that your testcase
- contains no bugs ....
-
- Don't worry if you're writing your test on Linux, other people
- can test it for you on Windows.
-
- Sometimes you may discover that a test doesn't show the
- expected result when run with the Microsoft runtime - either
- because there is a bug in their runtime or something is
- misleading or wrong in their documentation. In this case,
- please put a detailed description of the problem to
- mcs/class/doc/API-notes and do also report it to the list -
- we'll forward this to the Microsoft people from time to time
- to help them fix their documentation and runtime.
-
-<pre>
--------------------- TemplateTest.cs begins ----------
-
- // this is a template for making NUnit tests. Text enclosed
- // in square brackets (and the brackets themselves) should be
- // replaced by appropiate code.
-
- // [File Name].cs - NUnit Test Cases for [explain here]
- //
- // [Author Name] ([Author email Address])
- //
- // (C) [Copyright holder]
- //
-
- // these are the standard namespaces you will need. You may
- // need to add more depending on your tests.
- using NUnit.Framework;
- using System;
-
- // all test namespaces start with "MonoTests." Append the
- // Namespace that contains the class you are testing, e.g.
- // MonoTests.System.Collections
- namespace MonoTests.[Namespace]
- {
-
- // the class name should end with "Test" and start with the name
- // of the class you are testing, e.g. CollectionBaseTest
- public class [Class to be tested]Test : TestCase {
-
- // there should be two constructors for your class. The first
- // one (without parameters) should set the name to something
- // unique.
- // Of course the name of the method is the same as the name of
- // the class
- public [Constructor]() : base ("[Namespace.Class]") {}
- public [Constructor](string name) : base(name) {}
-
- // this method is run before each Test* method is called. You
- // can put variable initialization, etc. here that is common to
- // each test.
- // Just leave the method empty if you don't need to use it.
- protected override void SetUp() {}
-
- // this method is run after each Test* method is called. You
- // can put clean-up code, etc. here. Whatever needs to be done
- // after each test. Just leave the method empty if you don't need
- // to use it.
- protected override void TearDown() {}
-
- // this property is required. You need change the parameter for
- // typeof() below to be your class.
- public static ITest Suite {
- get {
- return new TestSuite(typeof([Classname here]));
- }
- }
-
- // this is just one of probably many test methods in your test
- // class. each test method must start with "Test". All methods
- // in your class which start with "Test" will be automagically
- // called by the NUnit framework.
- public void Test[Something] {
- // inside here you will exercise your class and then
- // call Assert()
- }
-}
-
----------------------- TemplateTest.cs ends --------------
-
----------------------- CollectionBaseTest.cs begins ------
- //
- // System.Collections.CollectionBase
- // Test suite for System.Collections.CollectionBase
- //
- // Author:
- // Nick D. Drochak II
- //
- // (C) 2001 Nick D. Drochak II
- //
-
-
- using System;
- using System.Collections;
- using NUnit.Framework;
-
- namespace MonoTests.System.Collections
- {
-
- public class CollectionBaseTest : TestCase
- {
- public CollectionBaseTest () : base
- ("System.Collection.CollectionBase testsuite")
- {}
- public CollectionBaseTest (String name) : base (name)
- {}
-
- // We need a concrete class to test the abstract base
- // class
- public class ConcreteCollection : CollectionBase
- {
- // These fields are used as markers to test
- // the On* hooks.
- public bool onClearFired;
- public bool onClearCompleteFired;
-
- public bool onInsertFired;
- public int onInsertIndex;
- public bool onInsertCompleteFired;
- public int onInsertCompleteIndex;
-
- public bool onRemoveFired;
- public int onRemoveIndex;
- public bool onRemoveCompleteFired;
- public int onRemoveCompleteIndex;
-
- public bool onSetFired;
- public int onSetOldValue;
- public int onSetNewValue;
- public bool onSetCompleteFired;
- public int onSetCompleteOldValue;
- public int onSetCompleteNewValue;
-
- // This constructor is used to test OnValid()
- public ConcreteCollection()
- {
- IList listObj;
- listObj = this;
- listObj.Add(null);
- }
-
- // This constructor puts consecutive integers into the list
- public ConcreteCollection(int i) {
- IList listObj;
- listObj = this;
-
- int j;
- for (j = 0; j< i; j++) {
- listObj.Add(j);
- }
- }
-
- // A helper method to look at a value in the
- // list at a specific index
- public int PeekAt(int index)
- {
- IList listObj;
- listObj = this;
- return (int) listObj[index];
- }
-
- // Mark the flag if this hook is fired
- protected override void OnClear() {
- this.onClearFired = true;
- }
-
- // Mark the flag if this hook is fired
- protected override void OnClearComplete()
- {
- this.onClearCompleteFired = true;
- }
-
- // Mark the flag, and save the paramter if
- // this hook is fired
- protected override void OnInsert(int index,
- object value)
- {
- this.onInsertFired = true;
- this.onInsertIndex = index;
- }
-
- // Mark the flag, and save the paramter if
- // this hook is fired
- protected override void OnInsertComplete(int index,
- object value)
- {
- this.onInsertCompleteFired = true;
- this.onInsertCompleteIndex = index;
- }
-
- // Mark the flag, and save the paramter if this hook
- // is fired
- protected override void OnRemove(int index,
- object value)
- {
- this.onRemoveFired = true;
- this.onRemoveIndex = index;
- }
-
- // Mark the flag, and save the paramter if this hook
- // is fired
- protected override void OnRemoveComplete(int index,
- object value)
- {
- this.onRemoveCompleteFired = true;
- this.onRemoveCompleteIndex = index;
- }
-
- // Mark the flag, and save the paramters if this hook
- // is fired
- protected override void OnSet(int index, object oldValue,
- object newValue)
- {
- this.onSetFired = true;
- this.onSetOldValue = (int) oldValue;
- this.onSetNewValue = (int) newValue;
- }
-
- // Mark the flag, and save the paramters if this hook
- // is fired
- protected override void OnSetComplete(int index,
- object oldValue,
- object newValue)
- {
- this.onSetCompleteFired = true;
- this.onSetCompleteOldValue = (int) oldValue;
- this.onSetCompleteNewValue = (int) newValue;
- }
- } // public class ConcreteCollection
-
- public static ITest Suite {
- get {
- return new TestSuite
- (typeof(CollectionBaseTest));
- }
- }
-
- // Check the count property
- public void TestCount() {
- ConcreteCollection myCollection;
- myCollection = new ConcreteCollection(4);
- Assert(4 == myCollection.Count);
- }
-
- // Make sure GetEnumerator returns an object
- public void TestGetEnumerator() {
- ConcreteCollection myCollection;
- myCollection = new ConcreteCollection(4);
- Assert(null != myCollection.GetEnumerator());
- }
-
- // OnValid disallows nulls
- public void TestOnValid() {
- ConcreteCollection myCollection;
- try {
- myCollection = new ConcreteCollection();
- }
- catch (ArgumentNullException) {
- }
- }
-
- // Test various Insert paths
- public void TestInsert() {
- ConcreteCollection myCollection;
- int numberOfItems;
- numberOfItems = 3;
- // The constructor inserts
- myCollection = new ConcreteCollection(numberOfItems);
- Assert(myCollection.onInsertFired);
- Assert(myCollection.onInsertCompleteFired);
-
- // Using the IList interface, check inserts in the middle
- IList listObj = myCollection;
- listObj.Insert(1, 9);
- Assert(myCollection.onInsertIndex == 1);
- Assert(myCollection.onInsertCompleteIndex == 1);
- Assert(myCollection.PeekAt(1) == 9);
- }
-
- // Test Clear and it's hooks
- public void TestClear()
- {
- ConcreteCollection myCollection;
- int numberOfItems;
- numberOfItems = 1;
- myCollection = new ConcreteCollection(numberOfItems);
- myCollection.Clear();
- Assert(myCollection.Count == 0);
- Assert(myCollection.onClearFired);
- Assert(myCollection.onClearCompleteFired);
- }
-
- // Test RemoveAt, other removes and the hooks
- public void TestRemove()
- {
- ConcreteCollection myCollection;
- int numberOfItems;
- numberOfItems = 3;
- // Set up a test collection
- myCollection = new ConcreteCollection(numberOfItems);
-
- // The list is 0-based. So if we remove the second one
- myCollection.RemoveAt(1);
-
- // We should see the original third one in it's place
- Assert(myCollection.PeekAt(1) == 2);
- Assert(myCollection.onRemoveFired);
- Assert(myCollection.onRemoveIndex == 1);
- Assert(myCollection.onRemoveCompleteFired);
- Assert(myCollection.onRemoveCompleteIndex == 1);
- IList listObj = myCollection;
- listObj.Remove(0);
- // Confirm parameters are being passed to the hooks
- Assert(myCollection.onRemoveIndex == 0);
- Assert(myCollection.onRemoveCompleteIndex == 0);
- }
-
- // Test the random access feature
- public void TestSet()
- {
- ConcreteCollection myCollection;
- int numberOfItems;
- numberOfItems = 3;
- myCollection = new ConcreteCollection(numberOfItems);
- IList listObj = myCollection;
- listObj[0] = 99;
- Assert((int) listObj[0] == 99);
- Assert(myCollection.onSetFired);
- Assert(myCollection.onSetCompleteFired);
- Assert(myCollection.onSetOldValue == 0);
- Assert(myCollection.onSetCompleteOldValue == 0);
- Assert(myCollection.onSetNewValue == 99);
- Assert(myCollection.onSetCompleteNewValue == 99);
- }
-}
-
-}
------------------------ CollectionBaseTest.cs ends --------
-
-</pre>
- <ul>
- * If you use Emacs, you might want to use the .emacs
- file and the package developed by Brad Merrill
- mailto:zbrad@cybercom.net. It will allow you to
- highlight and indent in C# style in your Emacs
- editor. (XEmacs will still work but it'll also
- complain).
-
- * CSharpDevelop is a GPLed IDE developed by IC#Code.
- Search for it at sourceforge if you are interested
- in it.
-
- * For those who Java: "A comparison of Microsoft's
- C# programming language to Sun Microsystem's Java
- Programming language" by Dare Obasanjo is a really good
- (very complete) text to read.
-
- * Suggest this point and more, now I can't think of
- anything more.
- </ul>
-
- Enjoy!!.
-
- (c) 2002, <a href="mailto:jaime@geneura.ugr.es">Jaime Anguiano Olarra</a>.
-
- The parts included in this document are property of their
- respective authors.
-
- Note: The identation of the source code has been changed a bit
- so it could fit better in the website. Anyway, as nothing more
- changed, the files should work as expected.
-