gecko-dev/mfbt/tests/TestEnumSet.cpp

233 строки
7.4 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/EnumSet.h"
using namespace mozilla;
enum SeaBird {
PENGUIN,
ALBATROSS,
FULMAR,
PRION,
SHEARWATER,
GADFLY_PETREL,
TRUE_PETREL,
DIVING_PETREL,
STORM_PETREL,
PELICAN,
GANNET,
BOOBY,
CORMORANT,
FRIGATEBIRD,
TROPICBIRD,
SKUA,
GULL,
TERN,
SKIMMER,
AUK
};
class EnumSetSuite {
public:
EnumSetSuite()
: mAlcidae(),
mDiomedeidae(ALBATROSS),
mPetrelProcellariidae(GADFLY_PETREL, TRUE_PETREL),
mNonPetrelProcellariidae(FULMAR, PRION, SHEARWATER),
mPetrels(GADFLY_PETREL, TRUE_PETREL, DIVING_PETREL, STORM_PETREL)
{ }
void runTests() {
testSize();
testContains();
testAddTo();
testAdd();
testAddAll();
testUnion();
testRemoveFrom();
testRemove();
testRemoveAllFrom();
testRemoveAll();
testIntersect();
testInsersection();
testEquality();
testDuplicates();
}
private:
void testSize() {
MOZ_RELEASE_ASSERT(mAlcidae.size() == 0);
MOZ_RELEASE_ASSERT(mDiomedeidae.size() == 1);
MOZ_RELEASE_ASSERT(mPetrelProcellariidae.size() == 2);
MOZ_RELEASE_ASSERT(mNonPetrelProcellariidae.size() == 3);
MOZ_RELEASE_ASSERT(mPetrels.size() == 4);
}
void testContains() {
MOZ_RELEASE_ASSERT(!mPetrels.contains(PENGUIN));
MOZ_RELEASE_ASSERT(!mPetrels.contains(ALBATROSS));
MOZ_RELEASE_ASSERT(!mPetrels.contains(FULMAR));
MOZ_RELEASE_ASSERT(!mPetrels.contains(PRION));
MOZ_RELEASE_ASSERT(!mPetrels.contains(SHEARWATER));
MOZ_RELEASE_ASSERT(mPetrels.contains(GADFLY_PETREL));
MOZ_RELEASE_ASSERT(mPetrels.contains(TRUE_PETREL));
MOZ_RELEASE_ASSERT(mPetrels.contains(DIVING_PETREL));
MOZ_RELEASE_ASSERT(mPetrels.contains(STORM_PETREL));
MOZ_RELEASE_ASSERT(!mPetrels.contains(PELICAN));
MOZ_RELEASE_ASSERT(!mPetrels.contains(GANNET));
MOZ_RELEASE_ASSERT(!mPetrels.contains(BOOBY));
MOZ_RELEASE_ASSERT(!mPetrels.contains(CORMORANT));
MOZ_RELEASE_ASSERT(!mPetrels.contains(FRIGATEBIRD));
MOZ_RELEASE_ASSERT(!mPetrels.contains(TROPICBIRD));
MOZ_RELEASE_ASSERT(!mPetrels.contains(SKUA));
MOZ_RELEASE_ASSERT(!mPetrels.contains(GULL));
MOZ_RELEASE_ASSERT(!mPetrels.contains(TERN));
MOZ_RELEASE_ASSERT(!mPetrels.contains(SKIMMER));
MOZ_RELEASE_ASSERT(!mPetrels.contains(AUK));
}
void testCopy() {
EnumSet<SeaBird> likes = mPetrels;
likes -= TRUE_PETREL;
MOZ_RELEASE_ASSERT(mPetrels.size() == 4);
MOZ_RELEASE_ASSERT(mPetrels.contains(TRUE_PETREL));
MOZ_RELEASE_ASSERT(likes.size() == 3);
MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
MOZ_RELEASE_ASSERT(likes.contains(DIVING_PETREL));
MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
}
void testAddTo() {
EnumSet<SeaBird> seen = mPetrels;
seen += CORMORANT;
seen += TRUE_PETREL;
MOZ_RELEASE_ASSERT(mPetrels.size() == 4);
MOZ_RELEASE_ASSERT(!mPetrels.contains(CORMORANT));
MOZ_RELEASE_ASSERT(seen.size() == 5);
MOZ_RELEASE_ASSERT(seen.contains(GADFLY_PETREL));
MOZ_RELEASE_ASSERT(seen.contains(TRUE_PETREL));
MOZ_RELEASE_ASSERT(seen.contains(DIVING_PETREL));
MOZ_RELEASE_ASSERT(seen.contains(STORM_PETREL));
MOZ_RELEASE_ASSERT(seen.contains(CORMORANT));
}
void testAdd() {
EnumSet<SeaBird> seen = mPetrels + CORMORANT +
STORM_PETREL;
MOZ_RELEASE_ASSERT(mPetrels.size() == 4);
MOZ_RELEASE_ASSERT(!mPetrels.contains(CORMORANT));
MOZ_RELEASE_ASSERT(seen.size() == 5);
MOZ_RELEASE_ASSERT(seen.contains(GADFLY_PETREL));
MOZ_RELEASE_ASSERT(seen.contains(TRUE_PETREL));
MOZ_RELEASE_ASSERT(seen.contains(DIVING_PETREL));
MOZ_RELEASE_ASSERT(seen.contains(STORM_PETREL));
MOZ_RELEASE_ASSERT(seen.contains(CORMORANT));
}
void testAddAll() {
EnumSet<SeaBird> procellariidae;
procellariidae += mPetrelProcellariidae;
procellariidae += mNonPetrelProcellariidae;
MOZ_RELEASE_ASSERT(procellariidae.size() == 5);
// Both procellariidae and mPetrels include GADFLY_PERTEL and TRUE_PETREL
EnumSet<SeaBird> procellariiformes;
procellariiformes += mDiomedeidae;
procellariiformes += procellariidae;
procellariiformes += mPetrels;
MOZ_RELEASE_ASSERT(procellariiformes.size() == 8);
}
void testUnion() {
EnumSet<SeaBird> procellariidae = mPetrelProcellariidae +
mNonPetrelProcellariidae;
MOZ_RELEASE_ASSERT(procellariidae.size() == 5);
// Both procellariidae and mPetrels include GADFLY_PETREL and TRUE_PETREL
EnumSet<SeaBird> procellariiformes = mDiomedeidae + procellariidae +
mPetrels;
MOZ_RELEASE_ASSERT(procellariiformes.size() == 8);
}
void testRemoveFrom() {
EnumSet<SeaBird> likes = mPetrels;
likes -= TRUE_PETREL;
likes -= DIVING_PETREL;
MOZ_RELEASE_ASSERT(likes.size() == 2);
MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
}
void testRemove() {
EnumSet<SeaBird> likes = mPetrels - TRUE_PETREL -
DIVING_PETREL;
MOZ_RELEASE_ASSERT(likes.size() == 2);
MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
}
void testRemoveAllFrom() {
EnumSet<SeaBird> likes = mPetrels;
likes -= mPetrelProcellariidae;
MOZ_RELEASE_ASSERT(likes.size() == 2);
MOZ_RELEASE_ASSERT(likes.contains(DIVING_PETREL));
MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
}
void testRemoveAll() {
EnumSet<SeaBird> likes = mPetrels - mPetrelProcellariidae;
MOZ_RELEASE_ASSERT(likes.size() == 2);
MOZ_RELEASE_ASSERT(likes.contains(DIVING_PETREL));
MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
}
void testIntersect() {
EnumSet<SeaBird> likes = mPetrels;
likes &= mPetrelProcellariidae;
MOZ_RELEASE_ASSERT(likes.size() == 2);
MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
MOZ_RELEASE_ASSERT(likes.contains(TRUE_PETREL));
}
void testInsersection() {
EnumSet<SeaBird> likes = mPetrels & mPetrelProcellariidae;
MOZ_RELEASE_ASSERT(likes.size() == 2);
MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
MOZ_RELEASE_ASSERT(likes.contains(TRUE_PETREL));
}
void testEquality() {
EnumSet<SeaBird> likes = mPetrels & mPetrelProcellariidae;
MOZ_RELEASE_ASSERT(likes == EnumSet<SeaBird>(GADFLY_PETREL,
TRUE_PETREL));
}
void testDuplicates() {
EnumSet<SeaBird> likes = mPetrels;
likes += GADFLY_PETREL;
likes += TRUE_PETREL;
likes += DIVING_PETREL;
likes += STORM_PETREL;
MOZ_RELEASE_ASSERT(likes.size() == 4);
MOZ_RELEASE_ASSERT(likes == mPetrels);
}
EnumSet<SeaBird> mAlcidae;
EnumSet<SeaBird> mDiomedeidae;
EnumSet<SeaBird> mPetrelProcellariidae;
EnumSet<SeaBird> mNonPetrelProcellariidae;
EnumSet<SeaBird> mPetrels;
};
int main()
{
EnumSetSuite suite;
suite.runTests();
return 0;
}