Files
CoCoCapitalQuiz/tests/test_quiz.c
T

49 lines
2.3 KiB
C

#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "quiz.h"
static unsigned index_of(const char *code){unsigned i;for(i=0;i<50;++i)if(!strcmp(states[i].code,code))return i;assert(0);return 0;}
int main(void)
{
unsigned seed,i,j,p,positions[4]={0},last[50],changes=0;
char a[160],b[ANSWER_SIZE];
for(seed=1;seed<=2000;++seed){
unsigned seen[50]={0};quiz_start(seed);
for(i=0;i<50;++i){
assert(order[i]<50);++seen[order[i]];quiz_options(order[i]);p=0;
for(j=0;j<4;++j){unsigned k;assert(options[j]<50);if(options[j]==order[i]){++p;++positions[j];}for(k=0;k<j;++k)assert(options[k]!=options[j]);}
assert(p==1);if(seed>1 && last[i]!=order[i])++changes;last[i]=order[i];
}
for(i=0;i<50;++i)assert(seen[i]==1);
}
for(i=0;i<4;++i)assert(positions[i]>20000);
assert(changes>90000);
for(i=0;i<50;++i){
assert(classify(i,states[i].capital)==2);
strcpy(a,states[i].capital);
for(j=0;a[j];++j)if(a[j]>='a' && a[j]<='z')a[j]-=32;
assert(classify(i,a)==2);
for(j=0;a[j];++j)if((j&1) && a[j]>='A' && a[j]<='Z')a[j]+=32;
assert(classify(i,a)==2);
for(j=0;j<50;++j)if(j!=i)assert(classify(i,states[j].capital)==0);
}
assert(classify(index_of("MN"),"St. Paul")==2);
assert(classify(index_of("MN"),"st paul")==2);
assert(classify(index_of("MN")," sAiNt PaUl ")==2);
assert(classify(index_of("UT")," salt lake city ")==2);
assert(classify(index_of("CO"),"Dnever")==1);
assert(classify(index_of("AK"),"Juneu")==1);
assert(classify(index_of("MA"),"Austin")==0);
assert(classify(index_of("CO"),"")==0);
memset(a,'x',159);a[159]=0;assert(classify(0,a)==0);
normalize(" \t baton ROUGE \n ",b);assert(!strcmp(b,"baton rouge"));
quiz_start(2709);
for(i=0;i<50;++i){quiz_record(order[i],i%2?"wrong":states[order[i]].capital,!(i%2),!(i%4));quiz_record(order[i],"duplicate",1,1);}
assert(score==25 && corrections==13);
for(i=0;i<50;++i)assert(answered[i]==1);
quiz_start(2710);assert(score==0 && corrections==0);
for(i=0;i<50;++i)assert(!answered[i] && !responses[i][0]);
printf("PASS: 2000 shuffles, 100000 option sets, all casing / known-wrong capitals, aliases, distance, bounds, scoring, reset.\n");
return 0;
}