Skip to content

Commit

Permalink
Bug 1175485 part 4 - Add unit test for integer range. r=waldo
Browse files Browse the repository at this point in the history
--HG--
extra : source : 2fb0dd6ca01c21b9282e0d7637ac09c2e8539a02
  • Loading branch information
upsuper committed Jul 2, 2015
1 parent 5ce6110 commit 5ebb867
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 0 deletions.
163 changes: 163 additions & 0 deletions mfbt/tests/TestIntegerRange.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "mozilla/Assertions.h"
#include "mozilla/IntegerRange.h"

#include <stddef.h>

using mozilla::IsSame;
using mozilla::MakeRange;
using mozilla::Reversed;

const size_t kMaxNumber = 50;
const size_t kArraySize = 256;

template<typename IntType>
static IntType
GenerateNumber()
{
return static_cast<IntType>(rand() % kMaxNumber + 1);
}

template<typename IntType>
static void
TestSingleParamRange(const IntType aN)
{
IntType array[kArraySize];
IntType* ptr = array;
for (auto i : MakeRange(aN)) {
static_assert(IsSame<decltype(i), IntType>::value,
"type of the loop var and the param should be the same");
*ptr++ = i;
}

MOZ_RELEASE_ASSERT(ptr - array == static_cast<ptrdiff_t>(aN),
"Should iterates N items");
for (size_t i = 0; i < static_cast<size_t>(aN); i++) {
MOZ_RELEASE_ASSERT(array[i] == static_cast<IntType>(i),
"Values should equal to the index");
}
}

template<typename IntType>
static void
TestSingleParamReverseRange(const IntType aN)
{
IntType array[kArraySize];
IntType* ptr = array;
for (auto i : Reversed(MakeRange(aN))) {
static_assert(IsSame<decltype(i), IntType>::value,
"type of the loop var and the param should be the same");
*ptr++ = i;
}

MOZ_RELEASE_ASSERT(ptr - array == static_cast<ptrdiff_t>(aN),
"Should iterates N items");
for (size_t i = 0; i < static_cast<size_t>(aN); i++) {
MOZ_RELEASE_ASSERT(array[i] == static_cast<IntType>(aN - i - 1),
"Values should be the reverse of their index");
}
}

template<typename IntType>
static void
TestSingleParamIntegerRange()
{
const auto kN = GenerateNumber<IntType>();
TestSingleParamRange<IntType>(0);
TestSingleParamReverseRange<IntType>(0);
TestSingleParamRange<IntType>(kN);
TestSingleParamReverseRange<IntType>(kN);
}

template<typename IntType1, typename IntType2>
static void
TestDoubleParamRange(const IntType1 aBegin, const IntType2 aEnd)
{
IntType2 array[kArraySize];
IntType2* ptr = array;
for (auto i : MakeRange(aBegin, aEnd)) {
static_assert(IsSame<decltype(i), IntType2>::value, "type of the loop var "
"should be same as that of the second param");
*ptr++ = i;
}

MOZ_RELEASE_ASSERT(ptr - array == static_cast<ptrdiff_t>(aEnd - aBegin),
"Should iterates (aEnd - aBegin) times");
for (size_t i = 0; i < static_cast<size_t>(aEnd - aBegin); i++) {
MOZ_RELEASE_ASSERT(array[i] == static_cast<IntType2>(aBegin + i),
"Should iterate integers in [aBegin, aEnd) in order");
}
}

template<typename IntType1, typename IntType2>
static void
TestDoubleParamReverseRange(const IntType1 aBegin, const IntType2 aEnd)
{
IntType2 array[kArraySize];
IntType2* ptr = array;
for (auto i : Reversed(MakeRange(aBegin, aEnd))) {
static_assert(IsSame<decltype(i), IntType2>::value, "type of the loop var "
"should be same as that of the second param");
*ptr++ = i;
}

MOZ_RELEASE_ASSERT(ptr - array == static_cast<ptrdiff_t>(aEnd - aBegin),
"Should iterates (aEnd - aBegin) times");
for (size_t i = 0; i < static_cast<size_t>(aEnd - aBegin); i++) {
MOZ_RELEASE_ASSERT(array[i] == static_cast<IntType2>(aEnd - i - 1),
"Should iterate integers in [aBegin, aEnd) in reverse order");
}
}

template<typename IntType1, typename IntType2>
static void
TestDoubleParamIntegerRange()
{
const auto kStart = GenerateNumber<IntType1>();
const auto kEnd = static_cast<IntType2>(kStart + GenerateNumber<IntType2>());
TestDoubleParamRange(kStart, static_cast<IntType2>(kStart));
TestDoubleParamReverseRange(kStart, static_cast<IntType2>(kStart));
TestDoubleParamRange(kStart, kEnd);
TestDoubleParamReverseRange(kStart, kEnd);
}

int
main()
{
TestSingleParamIntegerRange<int8_t>();
TestSingleParamIntegerRange<int16_t>();
TestSingleParamIntegerRange<int32_t>();
TestSingleParamIntegerRange<int64_t>();

TestSingleParamIntegerRange<uint8_t>();
TestSingleParamIntegerRange<uint16_t>();
TestSingleParamIntegerRange<uint32_t>();
TestSingleParamIntegerRange<uint64_t>();

TestDoubleParamIntegerRange<int8_t, int8_t>();
TestDoubleParamIntegerRange<int16_t, int16_t>();
TestDoubleParamIntegerRange<int32_t, int32_t>();
TestDoubleParamIntegerRange<int64_t, int64_t>();

TestDoubleParamIntegerRange<uint8_t, uint8_t>();
TestDoubleParamIntegerRange<uint16_t, uint16_t>();
TestDoubleParamIntegerRange<uint32_t, uint32_t>();
TestDoubleParamIntegerRange<uint64_t, uint64_t>();

TestDoubleParamIntegerRange<int8_t, int16_t>();
TestDoubleParamIntegerRange<int16_t, int32_t>();
TestDoubleParamIntegerRange<int32_t, int64_t>();
TestDoubleParamIntegerRange<int64_t, int8_t>();

TestDoubleParamIntegerRange<uint8_t, uint64_t>();
TestDoubleParamIntegerRange<uint16_t, uint8_t>();
TestDoubleParamIntegerRange<uint32_t, uint16_t>();
TestDoubleParamIntegerRange<uint64_t, uint32_t>();

return 0;
}
1 change: 1 addition & 0 deletions mfbt/tests/moz.build
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ CppUnitTests([
'TestEnumSet',
'TestFloatingPoint',
'TestIntegerPrintfMacros',
'TestIntegerRange',
'TestJSONWriter',
'TestMacroArgs',
'TestMacroForEach',
Expand Down
1 change: 1 addition & 0 deletions testing/cppunittest.ini
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ skip-if = os != 'win'
[TestHashtables]
[TestID]
[TestIntegerPrintfMacros]
[TestIntegerRange]
[TestJSONWriter]
[TestJemalloc]
[TestLineBreak]
Expand Down

0 comments on commit 5ebb867

Please sign in to comment.