Prolog Unit Test Examples

Run all examples

Build a local gerrit.war and then run the script:

./run.sh

Note that a local Gerrit server is not needed because these unit test examples redefine wrappers of the gerrit:change\* rules to provide mocked change data.

Add a new unit test

Please follow the pattern in t1.pl, t2.pl, or t3.pl.

  • Put code to be tested in a file, e.g. rules.pl. For easy unit testing, split long clauses into short ones and test every positive and negative path.

  • Create a new unit test file, e.g. t1.pl, which should load the test source file and utils.pl.

    % First load all source files and the utils.pl.
    :- load([aosp_rules,utils]).
    
    :- begin_tests(t1).  % give this test any name
    
    % Use test0/1 or test1/1 to verify failed/passed goals.
    
    :- end_tests(_,0).   % check total pass/fail counts
    
  • Optionally replace calls to gerrit functions that depend on repository. For example, define the following wrappers and in source code, use change_branch/1 instead of gerrti:change_branch/1.

    change_branch(X) :- gerrit:change_branch(X).
    commit_label(L,U) :- gerrit:commit_label(L,U).
    
  • In unit test file, redefine the gerrit function wrappers and test. For example, in t3.pl, we have:

    :- redefine(uploader,1,uploader(user(42))).  % mocked uploader
    :- test1(uploader(user(42))).
    :- test0(is_exempt_uploader).
    
    % is_exempt_uploader/0 is expected to fail because it is
    % is_exempt_uploader :- uploader(user(Id)), memberchk(Id, [104, 106]).
    
    % Note that gerrit:remove_label does not depend on Gerrit repository,
    % so its caller remove_label/1 is tested without any redefinition.
    
    :- test1(remove_label('MyReview',[],[])).
    :- test1(remove_label('MyReview',submit(),submit())).