| # 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())). |