You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

150 lines
4.2 KiB

/*
* Copyright 2026 Axel Waggershauser
*/
// SPDX-License-Identifier: Apache-2.0
#include "oned/ODTelepenReader.h"
#include "gtest/gtest.h"
using namespace ZXing;
using namespace ZXing::OneD;
static Barcode Parse(int start, PatternRow row, std::initializer_list<ZXing::PatternType> tail = {0},
BarcodeFormat format = BarcodeFormat::Telepen)
{
auto opts = ReaderOptions().formats(format);
TelepenReader reader(opts);
static const std::initializer_list<ZXing::PatternType> starts[3] = {
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3 },
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3 },
{ 0, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3 }
};
static const std::initializer_list<ZXing::PatternType> stops[3] = {
{ 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
{ 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1 }
};
row.insert(row.begin(), starts[start - 1]);
row.insert(row.end(), stops[start - 1]);
row.insert(row.end(), tail);
PatternView next(row);
std::unique_ptr<RowReader::DecodingState> state;
return reader.decodePattern(0, next, state);
}
TEST(ODTelepenReaderTest, Alpha)
{
{
auto result = Parse(1, PatternRow({
1, 1, 3, 1, 3, 1, 3, 3, // A
1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1 // checksum
}));
ASSERT_TRUE(result.isValid());
EXPECT_EQ(result.format(), BarcodeFormat::TelepenAlpha);
EXPECT_EQ(result.symbologyIdentifier(), "]B0");
EXPECT_EQ(result.text(), "A");
}
{
auto result = Parse(1, PatternRow({1, 1, 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1}), {1});
EXPECT_EQ(result.text(), "A");
}
{
auto result = Parse(1, PatternRow({1, 1, 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1}), {100});
EXPECT_EQ(result.text(), "A");
}
{
auto result = Parse(1, PatternRow({1, 1, 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1}), {100, 5});
EXPECT_EQ(result.text(), "A");
}
}
TEST(ODTelepenReaderTest, Numeric)
{
auto result = Parse(1, PatternRow({
1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 3, 3, 3, 1,
3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1,
3, 3, 3, 1, 1, 1, 1, 1, 1, 1,
}));
ASSERT_TRUE(result.isValid());
EXPECT_EQ(result.format(), BarcodeFormat::TelepenNumeric);
EXPECT_EQ(result.symbologyIdentifier(), "]B1");
EXPECT_EQ(result.text(), "466X33");
}
TEST(ODTelepenReaderTest, NumAlpha)
{
auto result = Parse(1, PatternRow({
1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, // 12
3, 1, 3, 1, 1, 1, 3, 1, 1, 1, // <DLE>
1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, // 3
1, 1, 3, 3, 1, 1, 3, 1, 1, 1 // checksum 21
}));
ASSERT_TRUE(result.isValid());
// EXPECT_EQ(result.format(), BarcodeFormat::TelepenNumAlpha);
EXPECT_EQ(result.symbologyIdentifier(), "]B2");
EXPECT_EQ(result.text(), "123");
}
TEST(ODTelepenReaderTest, NumControl)
{
auto result = Parse(1, PatternRow({
1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, // 12
1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, // <SI> (ASCII 15)
1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, // 34
3, 1, 1, 1, 1, 1, 3, 1, 3, 1, // checksum 12
}), {0}, BarcodeFormat::TelepenNumeric);
ASSERT_TRUE(result.isValid());
// EXPECT_EQ(result.format(), BarcodeFormat::TelepenNumeric);
EXPECT_EQ(result.symbologyIdentifier(), "]B1");
EXPECT_EQ(result.text(), "12<SI>34");
}
TEST(ODTelepenReaderTest, AIMNumAlpha)
{
auto result = Parse(2, PatternRow({
1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, // 12
3, 1, 1, 3, 1, 3, 1, 1, 1, 1 // checksum (88)
}));
ASSERT_TRUE(result.isValid());
// EXPECT_EQ(result.format(), BarcodeFormat::TelepenNumAlpha);
EXPECT_EQ(result.symbologyIdentifier(), "]B1");
EXPECT_EQ(result.text(), "12");
}
TEST(ODTelepenReaderTest, AIMAlphaNum)
{
auto result = Parse(3, PatternRow({
1, 1, 3, 1, 3, 1, 3, 3, // A
3, 1, 3, 1, 1, 1, 3, 1, 1, 1, // <DLE>
1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, // 12
1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1 // checksum (7)
}));
ASSERT_TRUE(result.isValid());
// EXPECT_EQ(result.format(), BarcodeFormat::TelepenAlphaNum);
EXPECT_EQ(result.symbologyIdentifier(), "]B4");
EXPECT_EQ(result.text(), "A12");
}
TEST(ODTelepenReaderTest, WrongChecksum)
{
auto result = Parse(1, PatternRow({
1, 1, 3, 1, 3, 1, 3, 3, // A
1, 1, 3, 1, 3, 1, 3, 3 // wrong checksum
}));
EXPECT_EQ(result.format(), BarcodeFormat::TelepenAlpha);
EXPECT_EQ(result.error().type(), Error::Checksum);
}