Chris@1528: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@1528: Chris@1528: /* Chris@1530: Sonic Visualiser Chris@1530: An audio file viewer and annotation editor. Chris@1530: Centre for Digital Music, Queen Mary, University of London. Chris@1528: Chris@1530: This program is free software; you can redistribute it and/or Chris@1530: modify it under the terms of the GNU General Public License as Chris@1530: published by the Free Software Foundation; either version 2 of the Chris@1530: License, or (at your option) any later version. See the file Chris@1530: COPYING included with this distribution for more information. Chris@1528: */ Chris@1528: Chris@1528: #ifndef TEST_ZOOM_CONSTRAINTS_H Chris@1528: #define TEST_ZOOM_CONSTRAINTS_H Chris@1528: Chris@1528: #include "../PowerOfTwoZoomConstraint.h" Chris@1528: #include "../PowerOfSqrtTwoZoomConstraint.h" Chris@1528: Chris@1528: #include Chris@1528: #include Chris@1528: #include Chris@1528: Chris@1528: #include Chris@1528: Chris@1528: using namespace std; Chris@1528: Chris@1528: class TestZoomConstraints : public QObject Chris@1528: { Chris@1528: Q_OBJECT Chris@1528: Chris@1531: void checkFpp(const ZoomConstraint &c, Chris@1531: ZoomConstraint::RoundingDirection dir, Chris@1531: int n, Chris@1531: int expected) { Chris@1531: QCOMPARE(c.getNearestZoomLevel(ZoomLevel(ZoomLevel::FramesPerPixel, n), Chris@1531: dir), Chris@1531: ZoomLevel(ZoomLevel::FramesPerPixel, expected)); Chris@1531: } Chris@1531: Chris@1528: private slots: Chris@1528: void unconstrainedNearest() { Chris@1528: ZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 3, 3); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 20, 20); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 32, 32); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1530: QCOMPARE(c.getNearestZoomLevel(max), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented()), max); Chris@1528: } Chris@1528: Chris@1528: void unconstrainedUp() { Chris@1528: ZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 3, 3); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 20, 20); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 32, 32); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max, Chris@1531: ZoomConstraint::RoundUp), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented(), Chris@1531: ZoomConstraint::RoundUp), max); Chris@1528: } Chris@1528: Chris@1528: void unconstrainedDown() { Chris@1528: ZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 3, 3); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 20, 20); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 32, 32); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max, Chris@1531: ZoomConstraint::RoundDown), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented(), Chris@1531: ZoomConstraint::RoundDown), max); Chris@1528: } Chris@1528: Chris@1528: void powerOfTwoNearest() { Chris@1528: PowerOfTwoZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 3, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 20, 16); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 23, 16); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 24, 16); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 25, 32); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1530: QCOMPARE(c.getNearestZoomLevel(max), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented()), max); Chris@1528: } Chris@1528: Chris@1528: void powerOfTwoUp() { Chris@1528: PowerOfTwoZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 3, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 20, 32); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 32, 32); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 33, 64); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max, Chris@1531: ZoomConstraint::RoundUp), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented(), Chris@1531: ZoomConstraint::RoundUp), max); Chris@1528: } Chris@1528: Chris@1528: void powerOfTwoDown() { Chris@1528: PowerOfTwoZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 3, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 20, 16); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 32, 32); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 33, 32); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max, Chris@1531: ZoomConstraint::RoundDown), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented(), Chris@1531: ZoomConstraint::RoundDown), max); Chris@1528: } Chris@1528: Chris@1528: void powerOfSqrtTwoNearest() { Chris@1528: PowerOfSqrtTwoZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 3, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 18, 16); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 19, 16); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 20, 22); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 23, 22); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 28, 32); Chris@1528: // PowerOfSqrtTwoZoomConstraint makes an effort to ensure Chris@1528: // bigger numbers get rounded to a multiple of something Chris@1528: // simple (64 or 90 depending on whether they are power-of-two Chris@1528: // or power-of-sqrt-two types) Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 800, 720); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 1023, 1024); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 1024, 1024); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 1024, 1024); Chris@1531: checkFpp(c, ZoomConstraint::RoundNearest, 1025, 1024); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1530: QCOMPARE(c.getNearestZoomLevel(max), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented()), max); Chris@1528: } Chris@1528: Chris@1528: void powerOfSqrtTwoUp() { Chris@1528: PowerOfSqrtTwoZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 3, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 18, 22); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 22, 22); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 23, 32); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 800, 1024); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 1023, 1024); Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 1024, 1024); Chris@1528: // see comment above Chris@1531: checkFpp(c, ZoomConstraint::RoundUp, 1025, 1440); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max, Chris@1531: ZoomConstraint::RoundUp), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented(), Chris@1531: ZoomConstraint::RoundUp), max); Chris@1528: } Chris@1528: Chris@1528: void powerOfSqrtTwoDown() { Chris@1528: PowerOfSqrtTwoZoomConstraint c; Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 1, 1); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 2, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 3, 2); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 4, 4); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 18, 16); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 22, 22); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 23, 22); Chris@1528: // see comment above Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 800, 720); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 1023, 720); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 1024, 1024); Chris@1531: checkFpp(c, ZoomConstraint::RoundDown, 1025, 1024); Chris@1530: auto max = c.getMaxZoomLevel(); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max, Chris@1531: ZoomConstraint::RoundDown), max); Chris@1531: QCOMPARE(c.getNearestZoomLevel(max.incremented(), Chris@1531: ZoomConstraint::RoundDown), max); Chris@1528: } Chris@1528: }; Chris@1528: Chris@1528: #endif Chris@1528: