Home > XP > GUI testing with DUnit

GUI testing with DUnit

February 2nd, 2009

I don’t how I didn’t know this until now but it turns out there’s a whole section of DUnit designed to help you test GUI elements. What follows is small write up about how to do it.

I started with a dead simple app. Type your text into the edit box, click the button and the text shown in a label’s caption:

GUI for testing

GUI for testing

So I started with a TGUITestCase descendant:

type
  MainFormTests = class(TGUITestCase)
  protected
    procedure SetUp; override;
    procedure TearDown; override;
  published
    procedure Hookup;
  end;

DUnit runs the SetUp and TearDown methods before and after each test method. This is different than NUnit and other unit testing frameworks which call SetUp and TearDown once per test suite execution. So if in the SetUp we start the application and in the TearDown we close it then we will be starting and stopping the app for every test. This is undesirable in this type of testing since we will be changing state in application. Additionally it might slow the tests down to have to perform the application startup and shutdown over and over again.

To deal with this problem we’ll use a class from the TestExtensions unit called TTestSetup. TTestSetup is a decorator for a TTestCase. This means that you implement behavior before and after tests run … like setup and teardown code that should only run once. To get this done you need two things: 1) a subclass of TTestSetup in which you’ll do your one time setup and teardown and 2) do a little different test registration. Here’s the TTestSetup class:

uses TestFramework, TestExtensions, GUITesting, fMain;
 
type
  MainFormSetup = class(TTestSetup)
  private
    FMainForm : TForm1;
  protected
    procedure SetUp; override;
    procedure TearDown; override;
  end;

You can see here the main form reference for our test app and the SetUp and TearDown that will happen once. Next let’s see the TGUITestCase and the implementation code:

  MainFormTests = class(TGUITestCase)
  protected
    procedure TearDown; override;
  published
    procedure Hookup;
    procedure TestChangeEditText;
    procedure TestButtonClickWithText;
    procedure TestButtonClickWithNoText;
    procedure TestButtonClickWithOnlyWhiteSpace;
  end;
 
implementation
 
{ MainFormSetUp }
 
procedure MainFormSetUp.SetUp;
begin
  FMainForm := TForm1.Create(Application);
  FMainForm.Show;
  inherited;
end;
 
procedure MainFormSetUp.TearDown; 
begin 
  FMainForm.Release;
  FMainForm.Free;
  inherited
end;
 
{ MainFormTests }
 
procedure MainFormTests.Hookup;
begin
  Check(True);
end;
 
procedure MainFormTests.TearDown;
begin
  GUI := nil;
  inherited;
end;
 
procedure MainFormTests.TestButtonClickWithNoText;
var
  lbl: TLabel;
  LabelText: string;
begin
  RunGUITestSequence(LabelText, lbl, '');
  CheckEquals(LabelText, lbl.Caption);
end;
 
procedure MainFormTests.TestButtonClickWithOnlyWhiteSpace;
var
  lbl : TLabel;
  LabelText : string;
begin
  RunGUITestSequence(LabelText, lbl, '    ');
  CheckEquals(LabelText, lbl.Caption);
end;
 
procedure MainFormTests.RunGUITestSequence(var LabelText: string; var lbl: TLabel; const TestValue : string);
var
  Edit: TEdit;
begin
  lbl := FindControl('Label1') as TLabel;
  LabelText := lbl.Caption;
  Edit := FindControl('Edit1') as TEdit;
  Edit.Text := TestValue;
  Click('Button1');
end;
 
procedure MainFormTests.TestChangeEditText;
var
  Edit: TEdit;
begin
  Edit := FindControl('Edit1') as TEdit;
  Edit.Text := 'I like pizza';
  CheckEquals('I like pizza', Edit.Text);
end;
 
procedure MainFormTests.TestButtonClickWithText;
var
  lbl: TLabel;
begin
  Click('Button1');
  lbl := FindControl('Label1') as TLabel;
  CheckEquals('I like pizza', lbl.Caption);
end;
 
initialization
  RegisterTest(MainFormSetUp.Create(MainFormTests.Suite));

With the test registration above, the DUnit test tree looks a little different:

DUnit test tree with setup decorator

DUnit test tree with setup decorator

Now for the fun part.

You take these tests and recreate my test application. Comment below about how it went and what questions, if any, you had.

XP , , , ,

  1. ahmet
    February 2nd, 2009 at 09:21 | #1

    Have u ever played with OpenCtf ?
    http://www.mikejustin.com/open.html#item_261

  2. February 2nd, 2009 at 23:07 | #2

    Great example, Thank you

    I wasn’t aware of DUnit with GUI testing.

  3. esteban
    February 2nd, 2009 at 23:23 | #3

    I did not notice this feature DUnit.
    thanks.

  4. February 5th, 2009 at 08:06 | #4

    So did anyone try the challenge?

  5. February 5th, 2009 at 10:03 | #5

    VERY cool example! We’ve been always telling people that automated GUI testing is difficult/impossible…
    Thanks,
    Pawel

  6. February 10th, 2009 at 04:20 | #6

    Just tried OpenCtf, lot of testning for free and easy to use. Thanks for the tip Ahmet.

  7. February 10th, 2009 at 12:49 | #7

    “This is different than NUnit and other unit testing frameworks which call SetUp and TearDown once per test suite execution.”

    Sorry, but you’re way off base here. SetUp and TearDown are always called once per test method, in NUnit as well as in DUnit (along with csUnit, and I’m pretty sure JUnit, and probably every other xUnit-like framework out there).

    Are you thinking of NUnit’s FixtureSetUp and FixtureTearDown? Those are more or less equivalent to what you can do with a single TTestSetup in DUnit.

  8. February 13th, 2009 at 07:47 | #8

    Thanks Joe. I’ve updated the article accordingly.

  9. April 20th, 2009 at 10:42 | #9

    Jody,

    Thanks for the post! I finally got around to trying this and it was an…interesting experience. Here’s how it went:

    1) The test unit didn’t compile. The uses clause is missing Forms and StdCtrls, and RunGUITestSequence isn’t included in the object declaration.

    2) I can’t see the point of the “Hookup” test.

    3) In MainFormSetUp.TearDown you’re calling both Release and Free. Release just posts a message that eventually frees the form, so it’s unnecessary.

    4) In MainFormTests.TearDown you have “GUI := nil”, but you never assign it in the first place. I’m assuming that’s left over junk from before you used TTestSetup.

    5) TestChangeEditText fails if the edit doesn’t exist, which I guess is good from a TDD standpoint, but the CheckEquals call is just verifying that the VCL doesn’t have bugs, which seems like a strange thing to do.

    Ok, finally got to compiling and running tests:

    6) Created an empty fMain form and ran it. Hookup passed, the other 4 did not.

    7) Dropped a button, edit, and label on the form and used default properties for everything. TestButtonClickWithText failed, the other 4 passed.

    8) I finally add the event handler you described in the opening paragraph (Label1.Caption := Edit1.Text). TestButtonClickWithNoText and TestButtonClickWithOnlyWhiteSpace both fail, TestChangeEditText and TestButtonClickWithText both pass.

    9) I remove the event handler entirely, and change Label1’s caption to “I like pizza”. All 5 tests pass.

    So I think I managed to recreate your test application, but only if you were lying about what it did. ;)

    I’m also curious about the separation of TestChangeEditText and TestButtonClickWithText. If the application did what you described, TestButtonClickWithText would only work if it was run immediately after TestButtonClickWithText. DUnit doesn’t randomize the test order, so that isn’t a concern, but it also means the test can’t be run on its own.

  10. April 21st, 2009 at 07:25 | #10

    Hi Craig,

    Thanks for trying out the challenge and posting your experience!

    Here’s the implementation code for the form:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Trim(Edit1.Text) <> '' then
        Label1.Caption := Edit1.Text;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Label1.Caption := '';
    end;

    To answer your questions:

    The Hookup test: This is a habit I developed. The first test I write is Hookup. I use it to be sure my new test suite is properly registered and working the way I expect. You can blame Ron Jeffries for this habit :P

    GUI := nil: The GUI property of TGUITestCase is assigned in the SetUp. The default behavior sets GUI to the first form that’s created in the test. That’s why you don’t see an assignment of GUI in my test case.

    The TestChangeEditText test: This was really a boot-strapping test. I wrote it to discover if I could interact with the form elements. I probably should have deleted this test after writing the succeeding tests.

    Regarding item number nine in your list: Guess I should have added a test that specifies that the label caption should be blank on startup :)

    Regarding your last paragraph: You’re right. Those two tests should be combined into one test.

    Thanks again for posting your experience!

    BTW, I love Beyond Compare. :)

  11. June 9th, 2009 at 11:48 | #11

    Thanks for a very helpful article!

  12. June 10th, 2009 at 09:56 | #12

    Just an other observation of me. I think it may be useful for others.
    I wanted to apply D-Unit in testing MDI-child forms but I couldn’t manage to do so with

    procedure MainFormSetUp.SetUp;
    begin
    FMainForm := TMDIForm.Create(Application);
    FMainForm.Show;
    FMDIChild := TMDIChild.Create(FMainForm);
    inherited;
    end;

    an exception was thrown as a result. Then I tried:

    procedure MainFormSetUp.SetUp;
    begin
    Application.CreateForm(TMDIForm, FMainForm);
    FMainForm.Show;
    FMDIChild := TMDIChild.Create(FMainForm);
    inherited;
    end;

    This had worked!

  13. Harvey
    July 20th, 2009 at 04:40 | #13

    Where is the download for DUNIT 2?

  14. Jayman777
    November 18th, 2009 at 07:11 | #14

    If one of the forms I am testing may display a modal dialog box created by a call to MessageDlg, is there a way to programmatically press a button on the modal dialog box so that the unit test does not require the tester to manually click the modal dialog box?

  15. January 23rd, 2010 at 01:50 | #15

    Hi,
    Thanks a lot for sharing this informative information about DUNIT. I was looking about this from long time and your post really helps me a great deal. Keep it up.

  16. February 12th, 2010 at 21:37 | #16

    I greatly appreciate all the info I’ve read here. I will spread the word about your blog to other people. Cheers.

  17. February 19th, 2010 at 01:46 | #17

    This is a really interesting post. Thanks for sharing this.

  18. March 13th, 2010 at 09:05 | #18

    Don’t have cash to buy some real estate? Don’t worry, because that is achievable to take the home loans to solve such kind of problems. Therefore get a consolidation loan to buy all you need.

  19. March 16th, 2010 at 03:25 | #19

    Very interesting and informative site! Good job done by you guys, Thanks

  20. March 16th, 2010 at 03:26 | #20

    Great post, you are working great on this blog, i just want to say you that just keep it up.

  21. March 16th, 2010 at 03:28 | #21

    Wow! Thanks for the great informative post.
    I think the above article is informative for all concerned people. For me this Information is really really useful.

  22. March 16th, 2010 at 03:29 | #22

    Although post is nice but I am not agree with all the points. Any way best as compare to others…

  23. March 17th, 2010 at 09:47 | #23

    Very interesting information.

    One should read your articles for getting more and more info on GUI testing.

  24. March 17th, 2010 at 09:48 | #24

    Very nice post.

    I recommend every one should read your articles for getting more and more info on GUI testing.

  25. March 17th, 2010 at 09:50 | #25

    Although post is nice but I am not agree with all your points.

    But keep writing, it will give you more grip and expertise in you skills.

  26. March 17th, 2010 at 09:51 | #26

    Yeah off course, it is nice to see all this.

  27. March 26th, 2010 at 02:04 | #27

    Your blog is really excellent. It inspires the readers who has that great desire to lead a better and happier life. Thanks for sharing this information and hope to read more from you.

  28. March 26th, 2010 at 02:11 | #28

    Thanks, I like this post it is very good and informative. I am sure that this post will be very helpful.

  29. April 1st, 2010 at 10:57 | #29

    Your blog seems to be so delicious, I’ve known so much since i read it every day

  30. April 2nd, 2010 at 21:29 | #30

    Where is the download for DUNIT 2?

  31. April 10th, 2010 at 06:46 | #31

    I recommend every one should read your articles

  32. April 17th, 2010 at 22:29 | #32

    Thats a very clear code GUNIT object for creating interfaces. I think you should create cool interface for many programs and show it to us.

  33. May 6th, 2010 at 06:22 | #33

    informative

  34. May 6th, 2010 at 06:23 | #34

    nice, thnx really helpful

  35. May 11th, 2010 at 05:33 | #35

    Great post, what you said is really helpful to me. I can’t agree with you anymore. I have been talking with my friend about, he though it is really interesting as well. Keep up with your good work, I would come back to you.

  36. May 12th, 2010 at 23:53 | #36

    is there a way to programmatically press a button on the modal dialog box so that the unit test does not require the tester to manually click the modal dialog box?

  37. May 14th, 2010 at 23:16 | #37

    That issue referring to this topic is smashing! Thence scholars not have to finish the thesis writing or just thesis proposal by their own, they would get your help.

  38. May 19th, 2010 at 03:51 | #38

    I opine that this is workable to go to this site, just because only here scholars should see the good enough stuff referring to this good post. Thus, the thesis service would use this for student dissertation completing.

  39. May 21st, 2010 at 02:30 | #39

    To create the gapless thesis methodology can be a synonym of a cemetery for some people. But there are some other to forestall the unsuccess. Thence, I will recommend to use the assistance of the buy dissertation service, when people are willing their idea close to this topic be perfectly composed.

  40. May 21st, 2010 at 04:55 | #40

    You have great composing skillfulness and you thought seems to be amazing. I think that hard working students will like to complete the essays of such quality and the assignment writing service can do it for them.

  41. May 22nd, 2010 at 00:43 | #41

    When people are not sure what to opt for, term papers or american history essay, they can ask you, because you know the way to create the well done knowledge related to this topic.

  42. Jonny
    May 25th, 2010 at 03:51 | #42

    Hello, I’m using Delphi 7, and would use the D-Unit, but I am not able to install it, because I sought help at several sites but the installation is not very clear, could you help me please.

    Hugs.

  43. May 27th, 2010 at 03:07 | #43

    Some people say check information of our costs right before ordering custom written essays in the custom essays writing firm. And some people must also get the superb texts referring to this good post over here.

  44. May 27th, 2010 at 04:38 | #44

    Thank you so much for this. They are truly remarkable. What a Creativity!

  45. May 29th, 2010 at 03:03 | #45

    Brilliant! Very useful information for me.

  46. May 29th, 2010 at 11:56 | #46

    Thanks for posting this much valuable content.It is a great example and helpful to many of us.

  47. June 1st, 2010 at 17:57 | #47

    Brilliant! Very useful information for me.

  48. June 6th, 2010 at 12:19 | #48

    What is DUnit?

  49. June 9th, 2010 at 05:44 | #49

    What is DUnit?

  50. June 17th, 2010 at 21:24 | #50

    Nice one..,thank u for this one

  51. June 18th, 2010 at 16:50 | #51

    you really have avery nice blog,it’s the first time to be here but it won’t be the last untill then keep blogging.goodluck!

  52. June 21st, 2010 at 01:23 | #52

    Sorry, but you’re way off base here. SetUp and TearDown are always called once per test method, in NUnit as well as in DUnit (along with csUnit, and I’m pretty sure JUnit, and probably every other xUnit-like framework out there).

  53. July 2nd, 2010 at 17:57 | #53

    Yes, I’ve tried to use this one and it’s kind of amazing.

  54. July 5th, 2010 at 02:53 | #54

    Very nice Site number one topic Thanks you..

  55. July 5th, 2010 at 02:54 | #55

    Thanks for sharing. i really appreciate it that you shared with us such a informative post..

  56. July 5th, 2010 at 23:35 | #56

    [url=http://www.linksoflondonuk.com/Bracelets/"]charm bracelets[/url] is best jewellery.I like so,do you like.

  57. July 6th, 2010 at 19:41 | #57

    Every female in the world is willing to be unique, but doesn’t know the simple way to do that. But millions of people find the free ringtones or just cellphone ringtones to become unique.

  58. July 7th, 2010 at 18:14 | #58

    I admire what you have done here. I like the part where you say you are doing this to give back but I would assume by all the comments that this is working for you as well.

  59. July 9th, 2010 at 17:14 | #59

    admire what you have done here.

  60. July 9th, 2010 at 18:24 | #60

    Thanks for the post! I finally got around to trying thi

  61. July 14th, 2010 at 06:07 | #61

    Thanks for information you’ve given.. I will back for more..

  62. Ronaldmosely
    July 15th, 2010 at 23:28 | #62

    Woh.., nice article, thank you for sharing this. This article helps to many people. And also i like to tell about the EssayAcademia. EssayAcademia provides well written custom papers on a wide variety of subjects.

  63. July 17th, 2010 at 02:28 | #63

    I do not know what to say. This blog is fantastic and You know so much about this subject. So much so that you made me want to learn more about it. Your blog is my stepping stone, and thanks for the heads up on this subject.

  64. July 20th, 2010 at 06:30 | #64

    Brilliant! Very useful information for me.

  65. July 23rd, 2010 at 00:08 | #65

    Thanks for taking the time to share this, I feel strongly about it and love reading more on this topic.

  66. July 26th, 2010 at 00:50 | #66

    That is an awfully astounding column you’ve posted.
    Thanks a lot for that a fantastically amazing post!

  67. July 26th, 2010 at 23:03 | #67

    New properties and methods have been added to the PrintJob class to give you better control of the way content is printed from an AIR application, including the choice of printer, paper size, a
    nd number of copies. New properties also give you more information about the printer, such as printable area, whether the printer will print in color, and whether the print job is currently active.
    Io amo molto i programmi di presentazione come Powerpoint o Keynote. Per progettare una buona presentazione bisogna tenere conto di una serie di semplici regole e molto buon senso. http://www.tiffanycore.com

  68. July 27th, 2010 at 04:13 | #68

    Thanks for report.

  69. July 27th, 2010 at 18:47 | #69

    it was a wonderful chance to visit this kind of site and I am happy to know. thank you so much for giving us a chance to have this opportunity!

  70. July 28th, 2010 at 01:12 | #70

    Good website. I like the all pages and all comments. Thanks for all!!! Regards!!!

  71. July 28th, 2010 at 01:15 | #71

    Good website and happy messages. I like it. Thank you master!

  72. July 28th, 2010 at 01:16 | #72

    Hi WebMaster! Real good website! Good work!!!! Thank You!

  73. July 28th, 2010 at 01:22 | #73

    An amazing machine, you deserve to 1. These fantastic shoes can be a brilliant and attractive. Enjoy and of itself.

  74. July 28th, 2010 at 17:35 | #74

    An amazing machine, you deserve to 1. These fantastic shoes can be a brilliant and attractive. Enjoy and of itself.

  75. July 29th, 2010 at 03:46 | #75

    I appreciate yout report.

  76. July 29th, 2010 at 06:31 | #76

    very helpful guide and clearly explained, thanks

  77. July 29th, 2010 at 22:10 | #77

    Nice stuff. Thanx.

  78. August 2nd, 2010 at 17:00 | #78

    Nice stuff. Thanx.

  79. August 3rd, 2010 at 01:26 | #79

    This is such a great resource that you are providing and you give it away for free. I love seeing websites that understand the value of providing a quality resource for free. It is the old what goes around comes around routine. Did you acquired lots of links and I see lots of trackbacks??

  80. August 3rd, 2010 at 01:31 | #80

    I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new

    stuff here than anybody else!

  81. August 4th, 2010 at 23:15 | #81

    Its amazing, looking at the time and effort you put into your blog and detailed information you provide.It’s very beautiful!!!

  82. August 4th, 2010 at 23:24 | #82

    I can go with the example stated by you but truly speaking at the ends its quality that really matters.Thank you!

  83. August 6th, 2010 at 21:12 | #83

    I really liked your article. Keep up the good work.

  84. August 10th, 2010 at 21:08 | #84

    The code is quite helpful. I would like to say thank you so much.

  85. August 11th, 2010 at 13:09 | #85

    keep it up man!

  86. August 16th, 2010 at 07:06 | #86

    Th4t be an epic da shizzi4 post, th4nkie 4it & in da futures we’ll be seeing more of it

  87. August 16th, 2010 at 07:06 | #87

    We7ll I8be dat9 ogr6e speekie da speekie, gratz & than4x

  88. August 16th, 2010 at 07:07 | #88

    heb7e sh8at be th34nkie 4it on da posting left & righ8ty

  89. August 17th, 2010 at 01:43 | #89

    I posted your piece of writing 2 my myspace profile.

  90. August 17th, 2010 at 03:52 | #90

    Good post! I am also going to write a blog post about this… thanks

  91. August 18th, 2010 at 12:14 | #91

    If you are in the corner and have no money to go out from that point, you will require to take the personal loans. Just because that would help you emphatically. I get commercial loan every year and feel great because of it.

  92. August 20th, 2010 at 00:36 | #92

    Admiring the time and effort you put into your blog and detailed information you offer!

  93. August 20th, 2010 at 10:27 | #93

    I think the above article is informative for all concerned people. For me this Information is really really useful.

  94. August 21st, 2010 at 05:14 | #94

    I found your website perfect for my needs. It contains wonderful and helpful posts. I have read most of them and got a lot from them.

  95. August 21st, 2010 at 14:58 | #95

    Great illustration, you should do YouTube videos

  96. August 22nd, 2010 at 05:44 | #96

    thanks a lot for sharing this post.

  97. August 22nd, 2010 at 18:33 | #97

    @Joe White
    great post. keep it up.

  98. August 22nd, 2010 at 22:41 | #98

    I do not know what to say. This blog is fantastic

  99. August 23rd, 2010 at 10:20 | #99

    Wonderful post about “GUI testing with DUnit”.

  100. August 25th, 2010 at 01:41 | #100

    I do not know what to say. This blog is fantastic

  101. August 26th, 2010 at 19:49 | #101

    By learning these technologies, you open up so much more possibilities than if you narrow yourself to a select few set of components.

  102. August 26th, 2010 at 22:46 | #102

    Thank you for another great article. Where else could anyone get that kind of information in such a perfect way of writing? I have a presentation next week, and I am on the look for such information

  103. August 26th, 2010 at 22:48 | #103

    I admit, I have not been on this webpage in a long time… however it was another joy to see It is such an important topic and ignored by so many, even professionals. I thank you to help making people more aware of possible issues.
    Great stuff as usual…

  104. August 26th, 2010 at 22:49 | #104

    Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog. I am sure my visitors will find that very useful.

  105. August 27th, 2010 at 09:30 | #105

    a lot for sharing this informative information about DUNIT. I was looking about this from long time and your post really helps me a great deal. Keep it up.

  106. August 29th, 2010 at 10:30 | #106

    Very nice.

    Glass Brooklyn

  107. August 29th, 2010 at 10:31 | #107

    Very nice.

  108. August 30th, 2010 at 10:50 | #108

    @Jody Dawkins
    Nice site.

  109. August 30th, 2010 at 23:23 | #109

    I found your website perfect for my needs. It contains wonderful and helpful posts. I have read most of them and got a lot from them.

  110. September 1st, 2010 at 02:22 | #110

    Its great resource. i was finding that type inf and now i get it.thanks for this…

  111. September 1st, 2010 at 23:40 | #111

    thanks a lot for sharing this one. nice post!

  112. September 3rd, 2010 at 19:06 | #112

    Awesome post.
    this is actually what i was looking for.
    thank you for the post.
    keep going on.

  113. September 5th, 2010 at 18:22 | #113

    thanks a lot for sharing this one. nice post!

  114. September 6th, 2010 at 11:42 | #114

    GUI stands for Graphical User Interface. Thanks for posting this very informative blog. Looking forward for your next post.

  115. September 6th, 2010 at 19:20 | #115

    yes,we’ll use a class from the TestExtensions unit called TTestSetup.

  116. September 6th, 2010 at 21:35 | #116

    konstruktiv eigene Ideen und Anregungen einzubringen. Wir sind der Meinung, dass eine command nationale Herangehensweise dem internationalen Charakter des Internets und habitation vielfältigen thomas sabo
    Herausforderungen und Entwicklungen

  117. September 7th, 2010 at 18:42 | #117

    Speak quite righthttp://www.c2cjersey.com

  118. September 8th, 2010 at 10:58 | #118

    Nice post! thank you for sharing!

  119. September 9th, 2010 at 06:34 | #119

    WHAT DOES DUNIT STANDS FOR?

  120. September 9th, 2010 at 15:42 | #120

    Clean,simple and it really works

  121. September 9th, 2010 at 15:44 | #121

    Its seems like technical stuff

  122. September 9th, 2010 at 21:27 | #122

    Men revalue your topic! To buy custom essay papers or custom papers about this topic will be broad source of information!

  1. February 17th, 2010 at 17:08 | #1
  2. April 4th, 2010 at 08:25 | #2
  3. April 11th, 2010 at 22:34 | #3
  4. May 5th, 2010 at 20:19 | #4
  5. August 30th, 2010 at 04:44 | #5
  6. September 1st, 2010 at 05:36 | #6
  7. September 1st, 2010 at 05:37 | #7
  8. September 1st, 2010 at 05:37 | #8
  9. September 1st, 2010 at 05:38 | #9
  10. September 1st, 2010 at 05:38 | #10
  11. September 1st, 2010 at 05:38 | #11
  12. September 1st, 2010 at 05:39 | #12
  13. September 1st, 2010 at 12:25 | #13
  14. September 3rd, 2010 at 13:05 | #14
  15. September 3rd, 2010 at 15:02 | #15
  16. September 3rd, 2010 at 16:43 | #16
  17. September 3rd, 2010 at 17:44 | #17
  18. September 3rd, 2010 at 20:10 | #18
  19. September 3rd, 2010 at 21:12 | #19
  20. September 4th, 2010 at 05:51 | #20
  21. September 4th, 2010 at 07:17 | #21
  22. September 4th, 2010 at 08:39 | #22
  23. September 4th, 2010 at 10:20 | #23
  24. September 4th, 2010 at 20:07 | #24
  25. September 4th, 2010 at 21:27 | #25
  26. September 4th, 2010 at 22:38 | #26
  27. September 4th, 2010 at 23:49 | #27
  28. September 5th, 2010 at 00:51 | #28
  29. September 5th, 2010 at 02:02 | #29
  30. September 5th, 2010 at 03:31 | #30
  31. September 5th, 2010 at 05:07 | #31
  32. September 5th, 2010 at 06:40 | #32
  33. September 5th, 2010 at 06:40 | #33
  34. September 5th, 2010 at 06:40 | #34
  35. September 5th, 2010 at 06:41 | #35
  36. September 5th, 2010 at 07:46 | #36
  37. September 5th, 2010 at 07:46 | #37
  38. September 5th, 2010 at 08:57 | #38
  39. September 5th, 2010 at 10:10 | #39
  40. September 5th, 2010 at 10:10 | #40
  41. September 5th, 2010 at 10:11 | #41
  42. September 5th, 2010 at 10:11 | #42
  43. September 5th, 2010 at 10:11 | #43
  44. September 5th, 2010 at 10:12 | #44
  45. September 5th, 2010 at 18:32 | #45
  46. September 5th, 2010 at 23:00 | #46
  47. September 5th, 2010 at 23:00 | #47
  48. September 5th, 2010 at 23:01 | #48
  49. September 5th, 2010 at 23:01 | #49
  50. September 5th, 2010 at 23:01 | #50
  51. September 6th, 2010 at 06:18 | #51
  52. September 7th, 2010 at 07:54 | #52
  53. September 7th, 2010 at 09:34 | #53
  54. September 7th, 2010 at 11:18 | #54
  55. September 7th, 2010 at 14:28 | #55
  56. September 7th, 2010 at 15:57 | #56
  57. September 7th, 2010 at 21:36 | #57
  58. September 7th, 2010 at 23:12 | #58
  59. September 8th, 2010 at 00:29 | #59
  60. September 8th, 2010 at 01:54 | #60
  61. September 8th, 2010 at 03:02 | #61
  62. September 8th, 2010 at 07:48 | #62
  63. September 8th, 2010 at 09:17 | #63
  64. September 8th, 2010 at 11:37 | #64
  65. September 8th, 2010 at 12:50 | #65
  66. September 8th, 2010 at 21:37 | #66
  67. September 9th, 2010 at 03:37 | #67
  68. September 9th, 2010 at 05:21 | #68
  69. September 9th, 2010 at 06:46 | #69
  70. September 9th, 2010 at 08:13 | #70
  71. September 9th, 2010 at 09:47 | #71
  72. September 9th, 2010 at 12:45 | #72
  73. September 9th, 2010 at 14:24 | #73
  74. September 9th, 2010 at 16:08 | #74
  75. September 9th, 2010 at 17:35 | #75
  76. September 9th, 2010 at 19:23 | #76
  77. September 9th, 2010 at 20:28 | #77
  78. September 9th, 2010 at 21:35 | #78

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word