mirror of
https://github.com/schrodinger/pymol-open-source.git
synced 2026-06-04 20:04:21 +08:00
126 lines
3.3 KiB
C++
126 lines
3.3 KiB
C++
#include "Picking.h"
|
|
#include "Test.h"
|
|
|
|
using namespace pymol::test;
|
|
|
|
TEST_CASE("getTotalBits", "[Picking]")
|
|
{
|
|
PickColorConverter pickconv;
|
|
REQUIRE(pickconv.getTotalBits() == 12);
|
|
|
|
const int bits1[] = {1, 2, 3, 4};
|
|
pickconv.setRgbaBits(bits1);
|
|
REQUIRE(pickconv.getTotalBits() == 10);
|
|
|
|
const int bits2[] = {2, 3, 4, 5};
|
|
pickconv.setRgbaBits(bits2);
|
|
REQUIRE(pickconv.getTotalBits() == 14);
|
|
|
|
// check pick-though bit with 32bit
|
|
const int bits3[] = {8, 8, 8, 8};
|
|
pickconv.setRgbaBits(bits3);
|
|
REQUIRE(pickconv.getTotalBits() == 31);
|
|
}
|
|
|
|
TEST_CASE("validateCheckBits", "[Picking]")
|
|
{
|
|
PickColorConverter pickconv;
|
|
|
|
const int bits1[] = {2, 3, 4, 5};
|
|
pickconv.setRgbaBits(bits1, 2);
|
|
REQUIRE(pickconv.getTotalBits() == 8);
|
|
|
|
const int bits2[] = {8, 8, 8, 4};
|
|
pickconv.setRgbaBits(bits2, 3);
|
|
REQUIRE(pickconv.getTotalBits() == 17);
|
|
|
|
unsigned char color2[4] = {0xfc, 0x04, 0x0c, 0x2f};
|
|
REQUIRE(pickconv.validateCheckBits(color2));
|
|
color2[1] |= 0x02;
|
|
REQUIRE(!pickconv.validateCheckBits(color2));
|
|
}
|
|
|
|
TEST_CASE("indexFromColor", "[Picking]")
|
|
{
|
|
PickColorConverter pickconv;
|
|
|
|
unsigned index1 = 0x816u; // 12-bit: hightest bit, lowest bit, middle bits
|
|
unsigned char color1[4];
|
|
pickconv.colorFromIndex(color1, index1);
|
|
unsigned index2 = pickconv.indexFromColor(color1);
|
|
REQUIRE(index1 == index2);
|
|
|
|
index1 = 12345; // 14-bit
|
|
const int bits[] = {2, 3, 4, 5};
|
|
pickconv.setRgbaBits(bits);
|
|
|
|
unsigned char color2[4];
|
|
pickconv.colorFromIndex(color2, index1);
|
|
index2 = pickconv.indexFromColor(color2);
|
|
REQUIRE(index1 == index2);
|
|
|
|
// with different bit depth, colors should be different
|
|
REQUIRE((color1[0] != color2[0] || color1[1] != color2[1] ||
|
|
color1[2] != color2[2] || color1[3] != color2[3]));
|
|
}
|
|
|
|
TEST_CASE("rounding", "[Picking]")
|
|
{
|
|
PickColorConverter pickconv;
|
|
|
|
unsigned index1 = 1234; // 12-bit
|
|
unsigned char color1[4];
|
|
pickconv.colorFromIndex(color1, index1);
|
|
|
|
// withing rounding tolerance
|
|
color1[0] += 1;
|
|
color1[1] -= 1;
|
|
color1[2] += 2;
|
|
unsigned index2 = pickconv.indexFromColor(color1);
|
|
REQUIRE(index1 == index2);
|
|
|
|
// beyond rounding tolernace
|
|
color1[0] += 1 << 4;
|
|
unsigned index3 = pickconv.indexFromColor(color1);
|
|
REQUIRE(index1 != index3);
|
|
}
|
|
|
|
TEST_CASE("pickmgr", "[Picking]")
|
|
{
|
|
PickColorManager pickmgr;
|
|
PickContext ctx{};
|
|
unsigned char color[4];
|
|
|
|
REQUIRE(pickmgr.count() == 0);
|
|
pickmgr.colorNext(color, &ctx, 123, 0);
|
|
REQUIRE(pickmgr.count() == 1);
|
|
pickmgr.colorNext(color, &ctx, 123, 0); // repeated
|
|
REQUIRE(pickmgr.count() == 1);
|
|
pickmgr.colorNext(color, &ctx, 124, 0);
|
|
pickmgr.colorNext(color, &ctx, 124, 5);
|
|
REQUIRE(pickmgr.count() == 3);
|
|
pickmgr.colorNext(color, &ctx, 0, cPickableNoPick); // no count increment
|
|
REQUIRE(pickmgr.count() == 3);
|
|
|
|
pickmgr.m_valid = true;
|
|
|
|
REQUIRE(pickmgr.getIdentifier(0) == nullptr);
|
|
REQUIRE(pickmgr.getIdentifier(1)->src.index == 123);
|
|
REQUIRE(pickmgr.getIdentifier(2)->src.index == 124);
|
|
REQUIRE(pickmgr.getIdentifier(3)->src.bond == 5);
|
|
REQUIRE(pickmgr.getIdentifier(4) == nullptr);
|
|
|
|
pickmgr.resetCount();
|
|
|
|
REQUIRE(!pickmgr.m_valid);
|
|
REQUIRE(pickmgr.count() == 0);
|
|
REQUIRE(pickmgr.getIdentifier(1) != nullptr); // still available
|
|
|
|
pickmgr.m_valid = true;
|
|
|
|
pickmgr.invalidate();
|
|
|
|
REQUIRE(!pickmgr.m_valid);
|
|
REQUIRE(pickmgr.getIdentifier(1) == nullptr);
|
|
}
|