Calculadora - static library - um exemplo completo

Agora vamos a um exemplo completo de uma calculadora de áreas com funções implementadas em uma static library.

Para esse exemplo, é necessário o foxmake instalado na sua máquina (ou ele incluído no seu projeto). Acesse a página do projeto em: documentação do foxmake.

Vamos lá:

  1. Crie um o arquivo "calc.h" com o seguinte conteúdo:

    src/calc/calc.h
    #ifndef CALC_H
    #define CALC_H
    
    namespace calc {
    
        double square_area( double side );
    
        double rectangle_area( double base, double height );
    
        double triangle_area( double base, double height );
        
        double circle_area( double radius );
    
    }
    
    #endif
    
  2. Agora crie o seguinte arquivo "calc.cpp" o seguinte conteúdo:

    src/calc/calc.cpp
    #include "calc.h"
    
    #include <cmath>
    
    namespace calc {
        
        double square_area( double side ) {
            return side * side;
        }
    
        double rectangle_area( double base, double height ) {
            return base * height;
        }
    
        double triangle_area( double base, double height ) {
            return ( base * height ) / 2.0f;
        }
    
        double circle_area( double radius ) {
            return M_PI * pow( radius, 2.0f );
        }
    
    }
    
  3. Agora vamos criar os arquivos de teste.
    Crie o arquivo "calctests.h" com o seguinte conteúdo:

    test/calc/calctests.h
    #include <xutest/xutest.h>
    
    #include "calc/calc.h"
    #include <cmath>
    
    TEST_CASE( square_area_test, CalcTests ) {
        ASSERT_EQUALS( calc::square_area( 10 ), 100, );
        ASSERT_EQUALS( calc::square_area( -1 ), 1, );
        ASSERT_EQUALS( calc::square_area( 0 ), 0, );
        ASSERT_EQUALS( calc::square_area( 2.5 ), 6.25, );
    }
    
    TEST_CASE( rectangle_area_test, CalcTests ) {
        ASSERT_EQUALS( calc::rectangle_area( 10, 10 ), 100, );
        ASSERT_EQUALS( calc::rectangle_area( -1, 20 ), -20, );
        ASSERT_EQUALS( calc::rectangle_area( 0, 10 ), 0, );
        ASSERT_EQUALS( calc::rectangle_area( 2.5, 10 ), 25, );
    }
    
    TEST_CASE( triangle_area_test, CalcTests ) {
        ASSERT_EQUALS( calc::triangle_area( 10, 10 ), 50, );
        ASSERT_EQUALS( calc::triangle_area( -1, 20 ), -10, );
        ASSERT_EQUALS( calc::triangle_area( 0, 10 ), 0, );
        ASSERT_EQUALS( calc::triangle_area( 2.5, 10 ), 12.5, );
    }
    
    TEST_CASE( circle_area_test, CalcTests ) {
        ASSERT_EQUALS( calc::circle_area( 10 ), M_PI * 100, );
        ASSERT_EQUALS( calc::circle_area( -1 ), M_PI, );
        ASSERT_EQUALS( calc::circle_area( 0 ), 0, );
        ASSERT_EQUALS( calc::circle_area( 2.5 ), M_PI * 6.25, );
    }
    
  4. Agora crie o arquivo "main.cpp" na pasta "test" com o seguinte conteúdo:

    test/main.cpp
    #include "calc/calctests.h"
    
    #include <xutest/xutest.h>
    
    int main() {
        RUN_ALL_TEST_CASES();
        return 0;
    }
    
  5. Agora só falta o arquivo FoxmakeFile. Crie ele com o seguinte conteúdo:

    FoxmakeFile
    output.file.name=libcalc.a
    
    src.dir=src
    test.dir=test
    build.dir=build
    obj.dir=obj
    bin.dir=bin
    
    IF os != "windows"
        test.linker.params=-ldl -rdynamic
    ENDIF
    
    test.libs=xutest
    

Feito isso você deve ter a seguinte estrutura de arquivos em seu projeto:

calculator
├── FoxMakefile
├── src
│   └── calc
│       ├── calc.cpp
│       └── calc.h
└── test
    ├── calc
    │   └── calctests.h
    └── main.cpp

Agora você pode executar o build com foxmake. Execute o seguinte:

foxmake testbuildall

Você deverá ver a seguinte saída:

Para baixar o exemplo desta página, acesse:

Download: calculator-static-library.zip.

Finalizando...

E assim chegamos ao final do exemplo de calculadora de áreas completo. Espero que tenha gostado das aulas e, agora, divirta-se com o xutest e, o foxmake combina muito bem com ele!