mirror of https://gitlab.com/ita1024/waf.git
gtest: added Google Unit Test example to playground
This commit is contained in:
parent
f4185e7a26
commit
1edb8a2f00
|
@ -0,0 +1,17 @@
|
|||
@echo off
|
||||
|
||||
rem edit this path
|
||||
set LIB_PATH=e:/project/libs
|
||||
|
||||
set INCLUDE=%CD%
|
||||
pushd "%LIB_PATH%"
|
||||
set LIB_PATH=%CD%
|
||||
popd
|
||||
|
||||
rem edit those paths
|
||||
set GTEST_PATH=%LIB_PATH%\gtest-1.7.0
|
||||
set INCLUDE=%INCLUDE%;%GTEST_PATH%\include
|
||||
set LIB=%LIB%;%GTEST_PATH%\msvc\gtest-msvc2013\Debug
|
||||
set LIB=%LIB%;%GTEST_PATH%\msvc\gtest-msvc2013\Release
|
||||
|
||||
python waf configure
|
|
@ -0,0 +1,16 @@
|
|||
#include <stdlib.h>
|
||||
#include "Accumulator.h"
|
||||
|
||||
Accumulator::Accumulator():m_total(0)
|
||||
{
|
||||
}
|
||||
|
||||
void Accumulator::accumulate(const char * data)
|
||||
{
|
||||
m_total += strtol(data, 0, 0);
|
||||
}
|
||||
|
||||
int Accumulator::total() const
|
||||
{
|
||||
return m_total;
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef Accumulator_h_seen
|
||||
#define Accumulator_h_seen
|
||||
|
||||
/**
|
||||
* A not-very-useful class that accumulates int values from input data.
|
||||
*/
|
||||
class Accumulator
|
||||
{
|
||||
public:
|
||||
Accumulator();
|
||||
|
||||
/**
|
||||
* Given some input data, read to end of line and convert to an int
|
||||
*/
|
||||
void accumulate(const char * data);
|
||||
|
||||
int total() const;
|
||||
|
||||
private:
|
||||
int m_total;
|
||||
|
||||
};
|
||||
#endif
|
|
@ -0,0 +1,18 @@
|
|||
|
||||
#include "HelloWorld.h"
|
||||
HelloWorld::HelloWorld():m_message("Hello World")
|
||||
{
|
||||
}
|
||||
|
||||
HelloWorld::HelloWorld(const std::string & msg):m_message(msg)
|
||||
{}
|
||||
|
||||
std::string HelloWorld::message() const
|
||||
{
|
||||
return m_message;
|
||||
}
|
||||
|
||||
void HelloWorld::setMessage(const std::string & msg)
|
||||
{
|
||||
m_message = msg;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
#ifndef HelloWorld_h_seen
|
||||
#define HelloWorld_h_seen
|
||||
#include <string>
|
||||
class HelloWorld
|
||||
{
|
||||
public:
|
||||
HelloWorld();
|
||||
HelloWorld(const std::string & msg);
|
||||
|
||||
std::string message() const;
|
||||
void setMessage(const std::string & msg);
|
||||
private:
|
||||
std::string m_message;
|
||||
};
|
||||
#endif
|
|
@ -0,0 +1,10 @@
|
|||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
bld(
|
||||
features = 'cxx cxxstlib',
|
||||
source = 'Accumulator.cpp HelloWorld.cpp',
|
||||
target = 'useless',
|
||||
export_includes = '.',
|
||||
)
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
// Copyright 2006, Google Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
GTEST_API_ int main(int argc, char **argv) {
|
||||
printf("Running main() from gtest_main.cc\n");
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
#include "gtest/gtest.h"
|
||||
#include "HelloWorld.h"
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
TEST(HelloWorldTest, test0)
|
||||
{
|
||||
HelloWorld hello;
|
||||
string expected("Hello World");
|
||||
ASSERT_EQ(expected, hello.message());
|
||||
}
|
||||
|
||||
TEST(HelloWorldTest, test1)
|
||||
{
|
||||
string expected("Hola Mundo");
|
||||
HelloWorld hello(expected);
|
||||
ASSERT_EQ(expected, hello.message());
|
||||
expected = "Hello, world!";
|
||||
hello.setMessage(expected);
|
||||
ASSERT_EQ(expected, hello.message());
|
||||
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
bld(
|
||||
features = 'cxx cxxprogram test',
|
||||
source = 'HelloWorldTest.cpp',
|
||||
target = 'unit_test_program',
|
||||
use = 'unittestmain useless GTEST',
|
||||
)
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
#include "gtest/gtest.h"
|
||||
#include "Accumulator.h"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class AccumulatorTest : public testing::Test
|
||||
{
|
||||
protected:
|
||||
virtual void SetUp();
|
||||
virtual void TearDown();
|
||||
|
||||
Accumulator * m_accumulator;
|
||||
|
||||
};
|
||||
|
||||
void AccumulatorTest::SetUp()
|
||||
{
|
||||
m_accumulator = new Accumulator;
|
||||
}
|
||||
|
||||
void AccumulatorTest::TearDown()
|
||||
{
|
||||
delete m_accumulator;
|
||||
}
|
||||
|
||||
static void readlines(const char * filename, vector<string> & lines)
|
||||
{
|
||||
string datafile("input");
|
||||
datafile += "/";
|
||||
datafile += filename;
|
||||
ifstream infile;
|
||||
infile.open(datafile.c_str());
|
||||
if (infile.is_open())
|
||||
{
|
||||
char buffer[BUFSIZ];
|
||||
while (!infile.eof())
|
||||
{
|
||||
infile.getline(buffer, BUFSIZ);
|
||||
lines.push_back(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(AccumulatorTest, test0)
|
||||
{
|
||||
vector<string> lines;
|
||||
readlines("test0.txt", lines);
|
||||
size_t expected(2);
|
||||
ASSERT_EQ(expected, lines.size());
|
||||
m_accumulator->accumulate(lines[0].c_str());
|
||||
ASSERT_EQ(10, m_accumulator->total());
|
||||
|
||||
}
|
||||
|
||||
TEST_F(AccumulatorTest, test1)
|
||||
{
|
||||
vector<string> lines;
|
||||
readlines("test1.txt", lines);
|
||||
size_t expected(6);
|
||||
ASSERT_EQ(expected, lines.size());
|
||||
for (vector<string>::const_iterator it(lines.begin());
|
||||
it != lines.end(); ++it)
|
||||
{
|
||||
const string & line(*it);
|
||||
m_accumulator->accumulate(line.c_str());
|
||||
}
|
||||
ASSERT_EQ(1+2+3+4+5, m_accumulator->total());
|
||||
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
10
|
|
@ -0,0 +1,5 @@
|
|||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
|
@ -0,0 +1,18 @@
|
|||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
|
||||
def fun(task):
|
||||
pass
|
||||
# print task.generator.bld.name_to_obj('somelib').link_task.outputs[0].abspath(task.env)
|
||||
# task.ut_exec.append('--help')
|
||||
|
||||
bld(
|
||||
features = 'cxx cxxprogram test',
|
||||
source = 'AccumulatorTest.cpp',
|
||||
target = 'unit_test_program',
|
||||
use = 'unittestmain useless GTEST',
|
||||
ut_cwd = bld.path.abspath(),
|
||||
ut_fun = fun
|
||||
)
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
def build(bld):
|
||||
bld.recurse('test0 test1')
|
||||
|
||||
bld(
|
||||
features = 'cxx stlib',
|
||||
source = 'gtest_main.cc',
|
||||
use = 'GTEST',
|
||||
target = 'unittestmain')
|
|
@ -0,0 +1,66 @@
|
|||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# Sylvain Rouquette, 2014
|
||||
# based on Richard Quirk's demo (unit_test), 2008
|
||||
|
||||
"""
|
||||
Execute tests during the build - requires cppunit
|
||||
|
||||
To force all tests, run with "waf build --alltests"
|
||||
"""
|
||||
|
||||
from waflib import Logs
|
||||
|
||||
top = '.'
|
||||
out = 'build'
|
||||
|
||||
def options(opt):
|
||||
opt.load('compiler_cxx')
|
||||
opt.load('waf_unit_test')
|
||||
opt.add_option('--onlytests', action='store_true', default=True, help='Exec unit tests only', dest='only_tests')
|
||||
|
||||
def configure(conf):
|
||||
conf.load('compiler_cxx')
|
||||
conf.load('waf_unit_test')
|
||||
conf.check(lib='gtest', uselib_store='GTEST')
|
||||
|
||||
|
||||
def gtest_results(bld):
|
||||
lst = getattr(bld, 'utest_results', [])
|
||||
if not lst:
|
||||
return
|
||||
for (f, code, out, err) in lst:
|
||||
# if not code:
|
||||
# continue
|
||||
|
||||
# uncomment if you want to see what's happening
|
||||
# print(str(out, 'utf-8'))
|
||||
output = str(out, 'utf-8').split('\n')
|
||||
for i, line in enumerate(output):
|
||||
if code and '[ RUN ]' in line:
|
||||
if ' OK ]' in output[i + 1]:
|
||||
continue
|
||||
# \r to get colors back...
|
||||
Logs.warn('%s' % output[i + 1])
|
||||
elif code and ' FAILED ]' in line:
|
||||
Logs.error('%s' % line)
|
||||
elif ' PASSED ]' in line:
|
||||
Logs.info('%s' % line)
|
||||
|
||||
def build(bld):
|
||||
bld.recurse('src tests')
|
||||
|
||||
# unittestw.summary is a pretty ugly function for displaying a report (feel free to improve!)
|
||||
# results -> bld.utest_results [(filename, returncode, stdout, stderr), (..., ), ...]
|
||||
#bld.add_post_fun(waf_unit_test.summary)
|
||||
bld.add_post_fun(gtest_results)
|
||||
|
||||
# to execute all tests:
|
||||
# $ waf --alltests
|
||||
# to set this behaviour permanenly:
|
||||
bld.options.all_tests = True
|
||||
|
||||
# debugging zone:
|
||||
# $ waf --zones=ut
|
||||
# setting the cwd for a unit test execution: see tests/test1/wscript_build (ut_cwd)
|
||||
|
Loading…
Reference in New Issue