Files
2026-01-29 11:29:56 +08:00

253 lines
6.9 KiB
C++

/* Copyright 2019-2025 Pierre Ossman <ossman@cendio.se> for Cendio AB
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <list>
#include <stdexcept>
#include <gtest/gtest.h>
#include <rfb/PixelFormat.h>
struct Params {
int b;
int d;
bool e;
bool t;
int rm;
int gm;
int bm;
int rs;
int gs;
int bs;
};
static std::ostream& operator<<(std::ostream& os, const Params& p)
{
return os << p.b << ", " << p.d << ", " <<
(p.e ? "true" : "false") << " " <<
(p.t ? "true" : "false") << ", " <<
p.rm << ", " << p.gm << ", " << p.bm << ", "
<< p.rs << ", " << p.gs << ", " << p.bs;
}
typedef testing::TestWithParam<Params> PixelFormatValid;
TEST_P(PixelFormatValid, constructor)
{
Params params;
rfb::PixelFormat* pf;
params = GetParam();
pf = nullptr;
EXPECT_NO_THROW({
pf = new rfb::PixelFormat(params.b, params.d, params.e, params.t,
params.rm, params.gm, params.bm,
params.rs, params.gs, params.bs);
});
delete pf;
}
typedef testing::TestWithParam<Params> PixelFormatInvalid;
TEST_P(PixelFormatInvalid, constructor)
{
Params params;
rfb::PixelFormat* pf;
params = GetParam();
pf = nullptr;
EXPECT_THROW({
pf = new rfb::PixelFormat(params.b, params.d, params.e, params.t,
params.rm, params.gm, params.bm,
params.rs, params.gs, params.bs);
}, std::invalid_argument);
delete pf;
}
typedef testing::TestWithParam<Params> PixelFormatIs888;
TEST_P(PixelFormatIs888, constructor)
{
Params params;
rfb::PixelFormat* pf;
params = GetParam();
pf = new rfb::PixelFormat(params.b, params.d, params.e, params.t,
params.rm, params.gm, params.bm,
params.rs, params.gs, params.bs);
EXPECT_TRUE(pf->is888());
delete pf;
}
typedef testing::TestWithParam<Params> PixelFormatNot888;
TEST_P(PixelFormatNot888, constructor)
{
Params params;
rfb::PixelFormat* pf;
params = GetParam();
pf = new rfb::PixelFormat(params.b, params.d, params.e, params.t,
params.rm, params.gm, params.bm,
params.rs, params.gs, params.bs);
EXPECT_FALSE(pf->is888());
delete pf;
}
static std::list<Params> validFormats()
{
std::list<Params> params;
/* Normal true color formats */
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 8, 16});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 24, 16, 8});
params.push_back(Params{16, 16, false, true, 15, 31, 15, 0, 5, 11});
params.push_back(Params{8, 8, false, true, 3, 7, 3, 0, 2, 5});
/* Excessive bpp */
params.push_back(Params{32, 16, false, true, 15, 31, 15, 0, 5, 11});
params.push_back(Params{16, 16, false, true, 15, 31, 15, 0, 5, 11});
params.push_back(Params{32, 8, false, true, 3, 7, 3, 0, 2, 5});
params.push_back(Params{16, 8, false, true, 3, 7, 3, 0, 2, 5});
/* Colour map */
params.push_back(Params{8, 8, false, false, 0, 0, 0, 0, 0, 0});
return params;
}
INSTANTIATE_TEST_SUITE_P(, PixelFormatValid, testing::ValuesIn(validFormats()));
static std::list<Params> invalidFormats()
{
std::list<Params> params;
params.push_back(Params{64, 24, false, true, 255, 255, 255, 0, 8, 16});
params.push_back(Params{18, 16, false, true, 15, 31, 15, 0, 5, 11});
params.push_back(Params{3, 3, false, true, 1, 1, 1, 0, 1, 2});
/* Invalid depth */
params.push_back(Params{16, 24, false, true, 15, 31, 15, 0, 5, 11});
params.push_back(Params{8, 24, false, true, 3, 7, 3, 0, 2, 5});
params.push_back(Params{8, 16, false, true, 3, 7, 3, 0, 2, 5});
params.push_back(Params{32, 24, false, false, 0, 0, 0, 0, 0, 0});
/* Invalid max values */
params.push_back(Params{32, 24, false, true, 254, 255, 255, 0, 8, 16});
params.push_back(Params{32, 24, false, true, 255, 253, 255, 0, 8, 16});
params.push_back(Params{32, 24, false, true, 255, 255, 252, 0, 8, 16});
params.push_back(Params{32, 24, false, true, 511, 127, 127, 0, 16, 20});
params.push_back(Params{32, 24, false, true, 127, 511, 127, 0, 4, 20});
params.push_back(Params{32, 24, false, true, 127, 127, 511, 0, 4, 8});
/* Insufficient depth */
params.push_back(Params{32, 16, false, true, 255, 255, 255, 0, 8, 16});
/* Invalid shift values */
params.push_back(Params{32, 24, false, true, 255, 255, 255, 25, 8, 16});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 25, 16});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 8, 25});
/* Overlapping channels */
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 7, 16});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 8, 15});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 16, 7});
return params;
}
INSTANTIATE_TEST_SUITE_P(, PixelFormatInvalid, testing::ValuesIn(invalidFormats()));
static std::list<Params> is888Formats()
{
std::list<Params> params;
/* Positive cases */
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 8, 16});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 24, 16, 8});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 24, 8, 0});
return params;
}
INSTANTIATE_TEST_SUITE_P(, PixelFormatIs888, testing::ValuesIn(is888Formats()));
static std::list<Params> not888Formats()
{
std::list<Params> params;
/* Low depth */
params.push_back(Params{32, 16, false, true, 15, 31, 15, 0, 8, 16});
params.push_back(Params{32, 8, false, true, 3, 7, 3, 0, 8, 16});
/* Low bpp and depth */
params.push_back(Params{16, 16, false, true, 15, 31, 15, 0, 5, 11});
params.push_back(Params{8, 8, false, true, 3, 7, 3, 0, 2, 5});
/* Colour map */
params.push_back(Params{8, 8, false, false, 0, 0, 0, 0, 0, 0});
/* Odd shifts */
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 8, 18});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 0, 11, 24});
params.push_back(Params{32, 24, false, true, 255, 255, 255, 4, 16, 24});
return params;
}
INSTANTIATE_TEST_SUITE_P(, PixelFormatNot888, testing::ValuesIn(not888Formats()));
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}