Bifurcation depuis
Charles-Henry Bertrand Van Ouytsel / Projet3_first_pull_request
Cette duplication a divergé du dépôt en amont.
-
Mélanie Colasse a rédigéMélanie Colasse a rédigé
fact.c 4,29 Kio
#include "third.h"
#include <CUnit/CUnit.h>
#include <CUnit/Basic.h>
#include <CUnit/TestRun.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
int is_prime(long value){
long len = (value / 2) + 1;
for(long x = 2; x < len; x++){
if(value % x == 0){
return 0;
}
} return 1;
}
long countLines(char *filename){
int fd = open(filename, O_RDONLY);
if(fd == -1) exit(EXIT_FAILURE);
struct stat finfo;
fstat(fd, &finfo);
char *map = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED, fd, 0);
if(map == MAP_FAILED) exit(EXIT_FAILURE);
size_t len = finfo.st_size / sizeof(char);
long counter = 0;
for(size_t i = 0; i < len; i++){
if(map[i] == '\n'){
counter++;
i++;
}
}
if(munmap(map,sizeof(finfo.st_size)) == -1) exit(EXIT_FAILURE);
if(close(fd) == -1) exit(EXIT_FAILURE);
return counter;
}
void test_assert_long(){ // test nbe lignes
normalMode(4, "test_long.txt", "long.txt");
CU_ASSERT_EQUAL(countLines("long.txt"), 199);
}
void test_assert_neg(){ // test que wrong format
normalMode(4, "test_neg.txt", "neg.txt");
CU_ASSERT_TRUE(countLines("neg.txt") < 5);
//CU_get_error_msg();//??
}
void test_assert_input(){
normalMode(4, "test_input.txt", "normal.txt"); //teste les resultats d'une entree normale
int fd = open("normal.txt", O_RDONLY);
if(fd == -1) exit(EXIT_FAILURE);
struct stat finfo;
fstat(fd, &finfo);
char *map = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED, fd, 0);
if(map == MAP_FAILED) exit(EXIT_FAILURE);
size_t len = finfo.st_size / sizeof(char);
int got_first = 0;
long to_factor = 0, current_factor = 0;
for(size_t i = 0; i < len; i++){
char c = map[i];
if(c != '\n'){
if(c == ' '){
if(got_first){
CU_ASSERT_TRUE(to_factor % current_factor == 0);
CU_ASSERT_TRUE(is_prime(current_factor));
while(to_factor % current_factor == 0){
to_factor /= current_factor;
}
current_factor = 0;
}
else{
got_first = 1;
}
}
else{
int tmp = c - '0';
if(got_first){
current_factor = (current_factor * 10) + tmp;
}
else{
to_factor = (to_factor * 10) + tmp;
}
}
}
else{
if(got_first){
while(to_factor % current_factor == 0){
to_factor /= current_factor;
}
CU_ASSERT_TRUE(to_factor == 1);
}
else{
CU_ASSERT_TRUE(is_prime(to_factor));
}
got_first = 0;
to_factor = 0; current_factor = 0;
}
}
if(munmap(map,sizeof(finfo.st_size)) == -1) exit(EXIT_FAILURE);
if(close(fd) == -1) exit(EXIT_FAILURE);
}
int setup(void) { return 0; }
int teardown(void) { return 0; }
// gcc fact.c -o fact -lpthread -lm -lcunit
// ./fact -N 1 files/example_input.txt end.txt
int main(int argc,const char *argv[]){
if(argv[1]==NULL){
CU_pSuite pSuite = NULL;
/* initialize the CUnit test registry */
if (CUE_SUCCESS != CU_initialize_registry()) return CU_get_error();
/* add a suite to the registry */
pSuite = CU_add_suite("Prime_suite", setup, teardown);
if (NULL == pSuite) {
CU_cleanup_registry();
return CU_get_error();
}
/* add the tests to the suite */
/* NOTE - ORDER IS IMPORTANT - MUST TEST fread() AFTER fprintf() */
if ((NULL == CU_add_test(pSuite, "input", test_assert_input)) ||
(NULL == CU_add_test(pSuite, "long", test_assert_long)) ||
(NULL == CU_add_test(pSuite, "neg", test_assert_neg)))
{
CU_cleanup_registry();
return CU_get_error();
}
/* Run all tests using the CUnit Basic interface */
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();
CU_cleanup_registry();
return CU_get_error();
}
else{normalMode(atoi(argv[2]), argv[3], argv[4]); }
return 0;
}