#summary Project Progress/Log for the Testing, Code Guru, Code Quality Assurance Project (GSoC2010) of Melange
#labels Phase-Design,Contents-Draft,Importance-Details

<wiki:toc max_depth="3" />


= Introduction =
  This document will be used to documents the progress and details of the Testing, Code Guru, Code Quality Assurance Project (GSoC2010) of Melange. 


= Meetings and Agendas =

== Wednesday May 14, 2010 18:00 in UTC ==
===Meeting Logs===
    Meeting start: http://www.thousandparsec.net/~irc/logm/%23melange.2010-05-14.log.html#t2010-05-14T18:08:47

    Meeting End: http://www.thousandparsec.net/~irc/logm/%23melange.2010-05-14.log.html#t2010-05-14T19:19:48    
    

===Meeting Notes===

  Location: #melange on freenode

  Chaired by: Sverre Rabbelier

  Notes taken by: Leo (Chong Liu)

    * Told Sverre what I had done:
       * Learned the code base of Melange and Melange tests
       * Generated the directory organization of Melange and Melange tests
       * Generated the package diagram and the class diagram of Melange
       * Made some statistics on the code base of Melange
    * Sverre suggested me to do:
       * Start with the testing of the modules which are the most important and used most, e.g. soc.logic.models.base and soc.views.models.base
       * Specifically add more test cases to the existing tests of these modules, e.g. tests.app.soc.logic.models.base and tests.app.soc.views.models.base


= Tentativ Timeline (more details will be added) =
== Week 1 (24 May - 30 May) ==

*TODO*:
  # Study the methods of app.soc.logic.models.base.Logic and calculate the frequency they are used.
  # Study existing test cases for app.soc.logic.models.base.Logic and their coverage.
  # Add test cases for app.soc.logic.models.base.Logic.

*Deliverables*:
  # Complete most of the test cases for app.soc.logic.models.base.Logic.

== Week 2 (31 May - 6 June) ==

*TODO*:
  # Finish up the work for app.soc.logic.models.base.Logic.
  # Add test cases for app.soc.views.models.base.View.
  # Add test cases for app.soc.logic.models.User.Logic and app.soc.views.models.User.View.
  # Add test cases for app.soc.logic.models.Role.Logic and app.soc.views.models.Role.View.

*Deliverables*:
  # Finish up the work for app.soc.logic.models.base.Logic.
  # Complete most of the work for the above modules.


== Week 3-6 (7 June - 4 July) ==
  # Add test cases for other modules of app.soc.logic.models and app.soc.views.models
  # Create a wiki page to explain how the test is currently done before the start date of TDD to provide a reference for developers to design their tests

== Week 7 (5 July - 11 July) ==
  # Add test cases for helper functions of  app.soc.logic and app.soc.views.

== Week 8 (12 July - 18 July): _mid-term evaluations_ ==
  # Finish up the work for app.soc.logic and app.soc.views and clean up code.

== Week 9-11 (19 July - 8 August) ==
  # Add test cases for modules of app.soc.modules.gsoc and app.soc.modules.ghop.

== Week 12 (9 August - 15 August): _pencils down_ ==
  # Finish up the work for app.soc.modules.gsoc and app.soc.modules.ghop and clean up code.