/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * 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/.
*/
void FontFeatureTest::testParseFeature()
{
{ // No font features specified
vcl::font::FeatureParser aParser(u"Font name with no features");
CPPUNIT_ASSERT_EQUAL(size_t(0), aParser.getFeatures().size());
}
{ // One feature specified, no value
vcl::font::FeatureParser aParser(u"Font name:abcd");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
}
{ // One feature specified, explicit value
vcl::font::FeatureParser aParser(u"Font name:abcd=5");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(5), aFeatures[0].m_nValue);
}
{ // One feature specified, explicit zero value
vcl::font::FeatureParser aParser(u"Font name:abcd=0");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(0), aFeatures[0].m_nValue);
}
{ // One feature specified, using plus prefix
vcl::font::FeatureParser aParser(u"Font name:+abcd");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
}
{ // One feature specified, using minus prefix
vcl::font::FeatureParser aParser(u"Font name:-abcd");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(0), aFeatures[0].m_nValue);
}
{ // One feature specified, with empty character range
vcl::font::FeatureParser aParser(u"Font name:abcd[]");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(0), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(-1), aFeatures[0].m_nEnd);
}
{ // One feature specified, with empty character range
vcl::font::FeatureParser aParser(u"Font name:abcd[:]");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(0), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(-1), aFeatures[0].m_nEnd);
}
{ // One feature specified, with start character range
vcl::font::FeatureParser aParser(u"Font name:abcd[3:]");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(3), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(-1), aFeatures[0].m_nEnd);
}
{ // One feature specified, with end character range
vcl::font::FeatureParser aParser(u"Font name:abcd[:3]");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(0), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(3), aFeatures[0].m_nEnd);
}
{ // One feature specified, with character range
vcl::font::FeatureParser aParser(u"Font name:abcd[3:6]");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(3), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(6), aFeatures[0].m_nEnd);
}
{ // One feature specified, with character range
vcl::font::FeatureParser aParser(u"Font name:abcd[3]");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(3), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(4), aFeatures[0].m_nEnd);
}
{ // One feature specified, with character range and value
vcl::font::FeatureParser aParser(u"Font name:abcd[3:6]=2");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(2), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(3), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(6), aFeatures[0].m_nEnd);
}
{ // One feature specified, with character range and 0 value
vcl::font::FeatureParser aParser(u"Font name:abcd[3:6]=0");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(0), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(3), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(6), aFeatures[0].m_nEnd);
}
{ // One feature specified, with character range and minus prefix
vcl::font::FeatureParser aParser(u"Font name:-abcd[3:6]");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(0), aFeatures[0].m_nValue);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(3), aFeatures[0].m_nStart);
CPPUNIT_ASSERT_EQUAL(static_cast<unsignedint>(6), aFeatures[0].m_nEnd);
}
{ // One feature specified, with CSS on
vcl::font::FeatureParser aParser(u"Font name:\"abcd\" on");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[0].m_nValue);
}
{ // One feature specified, with CSS off
vcl::font::FeatureParser aParser(u"Font name:'abcd' off");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(0), aFeatures[0].m_nValue);
}
{ // One feature specified, with CSS value
vcl::font::FeatureParser aParser(u"Font name:\"abcd\" 2");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("abcd"), aFeatures[0].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(2), aFeatures[0].m_nValue);
}
{ // Multiple features specified, no values
vcl::font::FeatureParser aParser(u"Font name:abcd&bcde&efgh");
CPPUNIT_ASSERT_EQUAL(size_t(3), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("efgh"), aFeatures[2].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(1), aFeatures[2].m_nValue);
}
{ // Multiple features specified, explicit values // Only 4 char parameter names supported - "toolong" is too long and ignored
vcl::font::FeatureParser aParser(u"Font name:abcd=1&bcde=0&toolong=1&cdef=3");
CPPUNIT_ASSERT_EQUAL(size_t(3), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
CPPUNIT_ASSERT_EQUAL(vcl::font::featureCode("cdef"), aFeatures[2].m_nTag);
CPPUNIT_ASSERT_EQUAL(uint32_t(3), aFeatures[2].m_nValue);
}
{ // Special case - "lang" is parsed specially and access separately not as a feature.
vcl::font::FeatureParser aParser(u"Font name:abcd=1&lang=slo");
CPPUNIT_ASSERT_EQUAL(size_t(1), aParser.getFeatures().size()); auto aFeatures = aParser.getFeatures();
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.17Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.