Skip to content

Commit

Permalink
ENH: Make Travis Linux builds run on Docker. [skip appveyor]
Browse files Browse the repository at this point in the history
The method copySign from MathTools has been removed because it was not
used and it's test failed with clang inside Docker.
  • Loading branch information
Woundorf authored and scalahater committed Mar 5, 2020
1 parent c101ecf commit ca9a393
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 222 deletions.
120 changes: 57 additions & 63 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,73 +1,67 @@
language: cpp

os:
- linux
- osx
matrix:
include:
# Linux (gcc)
- os: linux
dist: trusty
sudo: required
services: docker
compiler: gcc

sudo: required
dist: trusty
osx_image: xcode8.3
install:
- docker build -t ubuntu - < Dockerfile

compiler:
- gcc
- clang
script:
- docker run --rm -v $(pwd):/starviewer -e CC -e CXX ubuntu bash -c ". /opt/qt56/bin/qt56-env.sh && qmake"
- docker run --rm -v $(pwd):/starviewer -e CC -e CXX ubuntu bash -c ". /opt/qt56/bin/qt56-env.sh && make -j3"
- docker run --rm -v $(pwd):/starviewer -e TRAVIS_OS_NAME -w /starviewer/starviewer/tests/auto ubuntu
bash -c ". /opt/qt56/bin/qt56-env.sh && sh -c 'xvfb-run -s \"-screen 0 640x480x24\" ./autotests -silent'"

matrix:
exclude:
- os: osx
compiler: gcc
# Linux (clang)
- os: linux
dist: trusty
sudo: required
services: docker
compiler: clang

install:
- docker build -t ubuntu - < Dockerfile

env:
global:
- SDK_INSTALL_PREFIX="$HOME/uroot/usr/local"
- LD_LIBRARY_PATH="$SDK_INSTALL_PREFIX/lib:$SDK_INSTALL_PREFIX/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
- DYLD_LIBRARY_PATH="$SDK_INSTALL_PREFIX/lib"
- DYLD_FRAMEWORK_PATH="/usr/local/opt/qt5/lib"
script:
- docker run --rm -v $(pwd):/starviewer -e CC -e CXX ubuntu bash -c ". /opt/qt56/bin/qt56-env.sh && qmake -spec linux-clang"
- docker run --rm -v $(pwd):/starviewer -e CC -e CXX ubuntu bash -c ". /opt/qt56/bin/qt56-env.sh && make -j3"
- docker run --rm -v $(pwd):/starviewer -e TRAVIS_OS_NAME -w /starviewer/starviewer/tests/auto ubuntu
bash -c ". /opt/qt56/bin/qt56-env.sh && sh -c 'xvfb-run -s \"-screen 0 640x480x24\" ./autotests -silent'"

before_install:
- if [ "${TRAVIS_OS_NAME}" = "linux" ]; then
sudo apt-add-repository -y ppa:beineri/opt-qt562-trusty &&
sudo apt-get update -qq &&
sudo apt-get install -qq libgl1-mesa-dev libglu1-mesa-dev &&
sudo apt-get install -qq qt56base qt56declarative qt56tools qt56webengine qt56xmlpatterns &&
sudo apt-get install -qq libwrap0 libwrap0-dev ;
else
brew update > /dev/null &&
echo "Install Qt 5.6." &&
cp qt5.rb $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula &&
brew install qt5 &&
chmod -R 755 /usr/local/opt/qt5/* ;
fi
# Mac (clang)
- os: osx
osx_image: xcode8.3
compiler: clang
env:
- SDK_INSTALL_PREFIX="$HOME/uroot/usr/local"
- DYLD_LIBRARY_PATH="$SDK_INSTALL_PREFIX/lib"
- DYLD_FRAMEWORK_PATH="/usr/local/opt/qt5/lib"

install:
- if [ "${TRAVIS_OS_NAME}" = "linux" ]; then
. /opt/qt56/bin/qt56-env.sh &&
wget --directory-prefix=$HOME http:https://trueta.udg.edu/apt/ubuntu/devel/0.14/starviewer-sdk-linux-0.14-4.tar.xz &&
mkdir ~/uroot &&
tar xf ~/starviewer-sdk-linux-0.14-4.tar.xz -C ~/uroot ;
else
QTDIR="/usr/local/opt/qt5" &&
PATH="$QTDIR/bin:$PATH" &&
LDFLAGS=-L$QTDIR/lib &&
CPPFLAGS=-I$QTDIR/include &&
wget -nv --directory-prefix=$HOME http:https://trueta.udg.edu/apt/macosx/devel/0.14/starviewer-sdk-macosx-0.14-4.tar.xz &&
mkdir ~/uroot &&
tar xf ~/starviewer-sdk-macosx-0.14-4.tar.xz -C ~/uroot ;
fi
before_install:
- brew update > /dev/null
- echo "Install Qt 5.6."
- cp qt5.rb $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
- brew install qt5
- chmod -R 755 /usr/local/opt/qt5/*

before_script:
- if [ "${TRAVIS_OS_NAME}" = "linux" ]; then
export DISPLAY=:99.0 &&
sh -e /etc/init.d/xvfb start ;
fi
install:
- QTDIR="/usr/local/opt/qt5"
- PATH="$QTDIR/bin:$PATH"
- LDFLAGS=-L$QTDIR/lib
- CPPFLAGS=-I$QTDIR/include
- wget -nv --directory-prefix=$HOME http:https://trueta.udg.edu/apt/macosx/devel/0.14/starviewer-sdk-macosx-0.14-4.tar.xz
- mkdir ~/uroot
- tar xf ~/starviewer-sdk-macosx-0.14-4.tar.xz -C ~/uroot

script:
- cd starviewer
- if [ "${TRAVIS_OS_NAME}" = "linux" ] && [ "${CC}" = "clang" ]; then
qmake -spec linux-clang ;
else
qmake ;
fi
- make -j3 | sed 's/\/Applications\/Xcode\.app\/Contents\/Developer/[xcode]/g' | sed -E 's/\/(Users|home)\/travis\/uroot/[uroot]/g'
- cd tests/auto
- ./autotests -silent
script:
- cd starviewer
- qmake
- make -j3 | sed 's/\/Applications\/Xcode\.app\/Contents\/Developer/[xcode]/g' | sed -E 's/\/(Users|home)\/travis\/uroot/[uroot]/g'
- cd tests/auto
- ./autotests -silent
24 changes: 24 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
FROM ubuntu:14.04

ENV DEBIAN_FRONTEND noninteractive

RUN cat /etc/lsb-release
RUN apt-get -qq update
RUN apt-get install -qq software-properties-common
RUN apt-add-repository -y ppa:beineri/opt-qt563-trusty
RUN apt-get update -qq
RUN apt-get install -qq build-essential clang libgl1-mesa-dev libglu1-mesa-dev xvfb wget
RUN apt-get install -qq qt56base qt56declarative qt56tools qt56webengine qt56xmlpatterns
RUN apt-get install -qq libwrap0 libwrap0-dev zlib1g zlib1g-dev libssl-dev
RUN rm -rf /var/lib/apt/lists/*
RUN unset DEBIAN_FRONTEND

RUN wget -nv --directory-prefix=/ http:https://trueta.udg.edu/apt/ubuntu/devel/0.14/starviewer-sdk-linux-0.14-4.tar.xz
RUN mkdir /sdk-0.14
RUN tar xf /starviewer-sdk-linux-0.14-4.tar.xz -C /sdk-0.14

ENV SDK_INSTALL_PREFIX /sdk-0.14/usr/local
ENV LD_LIBRARY_PATH /sdk-0.14/usr/local/lib:/sdk-0.14/usr/local/lib/x86_64-linux-gnu

WORKDIR /starviewer/starviewer
CMD ["bash"]
12 changes: 0 additions & 12 deletions starviewer/src/core/mathtools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -395,18 +395,6 @@ unsigned int MathTools::roundUpToMultipleOfNumber(unsigned int i, unsigned int m
return i;
}

double MathTools::copySign(double x, double y)
{
if ((x >= +0.0 && y >= +0.0) || (x <= -0.0 && y <= -0.0))
{
return x;
}
else
{
return -x;
}
}

void MathTools::initializeRandomSeed()
{
static bool seedInit = false;
Expand Down
3 changes: 0 additions & 3 deletions starviewer/src/core/mathtools.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,6 @@ static unsigned int roundUpToPowerOf2(unsigned int v);
/// Retorna el primer múltiple de multiple més gran o igual que i. Només funciona si múltiple > 0, però no es comproven els paràmetres.
static unsigned int roundUpToMultipleOfNumber(unsigned int i, unsigned int multiple);

/// Retorna un double amb la magnitud d'x i el signe d'y. La mateixa funcionalitat que std::copysign de C++11.
static double copySign(double x, double y);

private:
/// Initializes random seed if needed
static void initializeRandomSeed();
Expand Down
144 changes: 0 additions & 144 deletions starviewer/tests/auto/unittests/core/test_mathtools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,15 +135,6 @@ private slots:
void isNaN_ShouldReturnExpectedValue_data();
void isNaN_ShouldReturnExpectedValue();

void copySign_ShouldReturnExpectedValue_data();
void copySign_ShouldReturnExpectedValue();

void copySign_ShouldReturnZeroWithExpectedSign_data();
void copySign_ShouldReturnZeroWithExpectedSign();

void copySign_ShouldReturnNaNWithExpectedSign_data();
void copySign_ShouldReturnNaNWithExpectedSign();

private:
void setupRadiansAndDegreesConversionData();
void setupComputeAngleOfAVectorData();
Expand Down Expand Up @@ -1252,141 +1243,6 @@ void test_MathTools::isNaN_ShouldReturnExpectedValue()
QCOMPARE(MathTools::isNaN(x), isNaN);
}

void test_MathTools::copySign_ShouldReturnExpectedValue_data()
{
QTest::addColumn<double>("value");
QTest::addColumn<double>("sign");
QTest::addColumn<double>("expectedResult");

QTest::newRow("+,+") << 7.78 << 18.61 << 7.78;
QTest::newRow("+,-") << 71.78 << -23.27 << -71.78;
QTest::newRow("-,+") << -83.84 << 81.16 << 83.84;
QTest::newRow("-,-") << -78.51 << -36.61 << -78.51;
QTest::newRow("+,+0") << 7.78 << 0.0 << 7.78;
QTest::newRow("+,-0") << 71.78 << -0.0 << 71.78;
QTest::newRow("-,+0") << -83.84 << 0.0 << -83.84;
QTest::newRow("-,-0") << -78.51 << -0.0 << -78.51;
QTest::newRow("+,+qNaN") << 7.78 << std::numeric_limits<double>::quiet_NaN() << -7.78;
QTest::newRow("+,-qNaN") << 71.78 << -std::numeric_limits<double>::quiet_NaN() << -71.78;
QTest::newRow("-,+qNaN") << -83.84 << std::numeric_limits<double>::quiet_NaN() << 83.84;
QTest::newRow("-,-qNaN") << -78.51 << -std::numeric_limits<double>::quiet_NaN() << 78.51;
QTest::newRow("+,+sNaN") << 7.78 << std::numeric_limits<double>::signaling_NaN() << -7.78;
QTest::newRow("+,-sNaN") << 71.78 << -std::numeric_limits<double>::signaling_NaN() << -71.78;
QTest::newRow("-,+sNaN") << -83.84 << std::numeric_limits<double>::signaling_NaN() << 83.84;
QTest::newRow("-,-sNaN") << -78.51 << -std::numeric_limits<double>::signaling_NaN() << 78.51;
}

void test_MathTools::copySign_ShouldReturnExpectedValue()
{
QFETCH(double, value);
QFETCH(double, sign);
QFETCH(double, expectedResult);

double result = MathTools::copySign(value, sign);

QCOMPARE(result, expectedResult);
}

void test_MathTools::copySign_ShouldReturnZeroWithExpectedSign_data()
{
QTest::addColumn<double>("inputZero");
QTest::addColumn<double>("sign");
QTest::addColumn<double>("zeroWithExpectedSign");

QTest::newRow("+0,+") << 0.0 << 18.61 << 0.0;
QTest::newRow("+0,-") << 0.0 << -23.27 << 0.0;
QTest::newRow("-0,+") << -0.0 << 81.16 << -0.0;
QTest::newRow("-0,-") << -0.0 << -36.61 << -0.0;
QTest::newRow("+0,+0") << 0.0 << 0.0 << 0.0;
QTest::newRow("+0,-0") << 0.0 << -0.0 << 0.0;
QTest::newRow("-0,+0") << -0.0 << 0.0 << -0.0;
QTest::newRow("-0,-0") << -0.0 << -0.0 << -0.0;
QTest::newRow("+0,+qNaN") << 0.0 << std::numeric_limits<double>::quiet_NaN() << -0.0;
QTest::newRow("+0,-qNaN") << 0.0 << -std::numeric_limits<double>::quiet_NaN() << -0.0;
QTest::newRow("-0,+qNaN") << -0.0 << std::numeric_limits<double>::quiet_NaN() << 0.0;
QTest::newRow("-0,-qNaN") << -0.0 << -std::numeric_limits<double>::quiet_NaN() << 0.0;
QTest::newRow("+0,+sNaN") << 0.0 << std::numeric_limits<double>::signaling_NaN() << -0.0;
QTest::newRow("+0,-sNaN") << 0.0 << -std::numeric_limits<double>::signaling_NaN() << -0.0;
QTest::newRow("-0,+sNaN") << -0.0 << std::numeric_limits<double>::signaling_NaN() << 0.0;
QTest::newRow("-0,-sNaN") << -0.0 << -std::numeric_limits<double>::signaling_NaN() << 0.0;
}

void test_MathTools::copySign_ShouldReturnZeroWithExpectedSign()
{
QFETCH(double, inputZero);
QFETCH(double, sign);
QFETCH(double, zeroWithExpectedSign);

// Hem de distingir +0 de -0. Una de les maneres, d'acord amb la Wikipedia (http:https://en.wikipedia.org/wiki/Signed_zero#Comparisons) és comprovar el el patró
// de bits. Per tant, agafem punters a les dues variables i comparem que siguin exactament els mateixos bits.
double zero = MathTools::copySign(inputZero, sign);
void *pZero = &zero;
void *pZeroWithExpectedSign = &zeroWithExpectedSign;
QVERIFY(memcmp(pZero, pZeroWithExpectedSign, sizeof(double)) == 0);
}

void test_MathTools::copySign_ShouldReturnNaNWithExpectedSign_data()
{
QTest::addColumn<double>("inputNaN");
QTest::addColumn<double>("sign");
QTest::addColumn<bool>("expectedSign");
// Interpretem true = +, false = -

QTest::newRow("+qNaN,+") << std::numeric_limits<double>::quiet_NaN() << 18.61 << false;
QTest::newRow("+qNaN,-") << std::numeric_limits<double>::quiet_NaN() << -23.27 << false;
QTest::newRow("-qNaN,+") << -std::numeric_limits<double>::quiet_NaN() << 81.16 << true;
QTest::newRow("-qNaN,-") << -std::numeric_limits<double>::quiet_NaN() << -36.61 << true;
QTest::newRow("+qNaN,+0") << std::numeric_limits<double>::quiet_NaN() << 0.0 << false;
QTest::newRow("+qNaN,-0") << std::numeric_limits<double>::quiet_NaN() << -0.0 << false;
QTest::newRow("-qNaN,+0") << -std::numeric_limits<double>::quiet_NaN() << 0.0 << true;
QTest::newRow("-qNaN,-0") << -std::numeric_limits<double>::quiet_NaN() << -0.0 << true;
QTest::newRow("+qNaN,+qNaN") << std::numeric_limits<double>::quiet_NaN() << std::numeric_limits<double>::quiet_NaN() << false;
QTest::newRow("+qNaN,-qNaN") << std::numeric_limits<double>::quiet_NaN() << -std::numeric_limits<double>::quiet_NaN() << false;
QTest::newRow("-qNaN,+qNaN") << -std::numeric_limits<double>::quiet_NaN() << std::numeric_limits<double>::quiet_NaN() << true;
QTest::newRow("-qNaN,-qNaN") << -std::numeric_limits<double>::quiet_NaN() << -std::numeric_limits<double>::quiet_NaN() << true;
QTest::newRow("+qNaN,+sNaN") << std::numeric_limits<double>::quiet_NaN() << std::numeric_limits<double>::signaling_NaN() << false;
QTest::newRow("+qNaN,-sNaN") << std::numeric_limits<double>::quiet_NaN() << -std::numeric_limits<double>::signaling_NaN() << false;
QTest::newRow("-qNaN,+sNaN") << -std::numeric_limits<double>::quiet_NaN() << std::numeric_limits<double>::signaling_NaN() << true;
QTest::newRow("-qNaN,-sNaN") << -std::numeric_limits<double>::quiet_NaN() << -std::numeric_limits<double>::signaling_NaN() << true;
QTest::newRow("+sNaN,+") << std::numeric_limits<double>::signaling_NaN() << 18.61 << false;
QTest::newRow("+sNaN,-") << std::numeric_limits<double>::signaling_NaN() << -23.27 << false;
QTest::newRow("-sNaN,+") << -std::numeric_limits<double>::signaling_NaN() << 81.16 << true;
QTest::newRow("-sNaN,-") << -std::numeric_limits<double>::signaling_NaN() << -36.61 << true;
QTest::newRow("+sNaN,+0") << std::numeric_limits<double>::signaling_NaN() << 0.0 << false;
QTest::newRow("+sNaN,-0") << std::numeric_limits<double>::signaling_NaN() << -0.0 << false;
QTest::newRow("-sNaN,+0") << -std::numeric_limits<double>::signaling_NaN() << 0.0 << true;
QTest::newRow("-sNaN,-0") << -std::numeric_limits<double>::signaling_NaN() << -0.0 << true;
QTest::newRow("+sNaN,+qNaN") << std::numeric_limits<double>::signaling_NaN() << std::numeric_limits<double>::quiet_NaN() << false;
QTest::newRow("+sNaN,-qNaN") << std::numeric_limits<double>::signaling_NaN() << -std::numeric_limits<double>::quiet_NaN() << false;
QTest::newRow("-sNaN,+qNaN") << -std::numeric_limits<double>::signaling_NaN() << std::numeric_limits<double>::quiet_NaN() << true;
QTest::newRow("-sNaN,-qNaN") << -std::numeric_limits<double>::signaling_NaN() << -std::numeric_limits<double>::quiet_NaN() << true;
QTest::newRow("+sNaN,+sNaN") << std::numeric_limits<double>::signaling_NaN() << std::numeric_limits<double>::signaling_NaN() << false;
QTest::newRow("+sNaN,-sNaN") << std::numeric_limits<double>::signaling_NaN() << -std::numeric_limits<double>::signaling_NaN() << false;
QTest::newRow("-sNaN,+sNaN") << -std::numeric_limits<double>::signaling_NaN() << std::numeric_limits<double>::signaling_NaN() << true;
QTest::newRow("-sNaN,-sNaN") << -std::numeric_limits<double>::signaling_NaN() << -std::numeric_limits<double>::signaling_NaN() << true;
}

void test_MathTools::copySign_ShouldReturnNaNWithExpectedSign()
{
QFETCH(double, inputNaN);
QFETCH(double, sign);
QFETCH(bool, expectedSign);

double NaN = MathTools::copySign(inputNaN, sign);
QVERIFY2(MathTools::isNaN(NaN), qPrintable(QString("actual: %1, expected: nan").arg(NaN)));

// Hem de distingir +NaN de -NaN. Aquest cop no podem comparar tot el patró de bits com amb els zeros, perquè hi ha bits que poden tenir diferents valors
// que representen NaN (http:https://en.wikipedia.org/wiki/NaN). El que sí podem fer és comprovar el bit més significatiu, el de més a l'esquerra, que és el del
// signe. Si el bit és zero vol dir positiu, i si és 1 vol dir negatiu (http:https://en.wikipedia.org/wiki/Sign_bit). Per fer-ho, llegim aquest float com si fos
// un unsigned long long per crear un bitset. D'aquest bitset n'hem de consultar l'últim bit, perquè estan ordenats de dreta a esquerra. Abans de tot
// comprovem que el format dels doubles sigui IEC 559 / IEEE 754. Sinó, tota la resta no té sentit.
QVERIFY(std::numeric_limits<double>::is_iec559);
unsigned long long *pNaN = reinterpret_cast<unsigned long long*>(&NaN);
std::bitset<8*sizeof(unsigned long long)> fNaNBits(*pNaN);
bool signBit = fNaNBits.test(fNaNBits.size() - 1);
QCOMPARE(!signBit, expectedSign);
}

void test_MathTools::setupRadiansAndDegreesConversionData()
{
QTest::addColumn<float>("radians");
Expand Down

0 comments on commit ca9a393

Please sign in to comment.