mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
465 lines
15 KiB
C
465 lines
15 KiB
C
/*
|
|
* Unit test suite for string format
|
|
*
|
|
* Copyright (C) 2007 Google (Evan Stade)
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#include "objbase.h"
|
|
#include "gdiplus.h"
|
|
#include "wine/test.h"
|
|
|
|
#define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
|
|
#define expectf(expected, got) ok(got == expected, "Expected %.2f, got %.2f\n", expected, got)
|
|
|
|
static void test_constructor(void)
|
|
{
|
|
GpStringFormat *format;
|
|
GpStatus stat;
|
|
INT n, count;
|
|
StringAlignment align, line_align;
|
|
StringTrimming trimming;
|
|
StringDigitSubstitute digitsub;
|
|
LANGID digitlang;
|
|
|
|
stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
|
|
expect(Ok, stat);
|
|
|
|
GdipGetStringFormatAlign(format, &align);
|
|
GdipGetStringFormatLineAlign(format, &line_align);
|
|
GdipGetStringFormatHotkeyPrefix(format, &n);
|
|
GdipGetStringFormatTrimming(format, &trimming);
|
|
GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
|
|
GdipGetStringFormatMeasurableCharacterRangeCount(format, &count);
|
|
|
|
expect(HotkeyPrefixNone, n);
|
|
expect(StringAlignmentNear, align);
|
|
expect(StringAlignmentNear, line_align);
|
|
expect(StringTrimmingCharacter, trimming);
|
|
expect(StringDigitSubstituteUser, digitsub);
|
|
expect(LANG_NEUTRAL, digitlang);
|
|
expect(0, count);
|
|
|
|
stat = GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
}
|
|
|
|
static void test_characterrange(void)
|
|
{
|
|
CharacterRange ranges[3];
|
|
INT count;
|
|
GpStringFormat* format;
|
|
GpStatus stat;
|
|
|
|
stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
|
|
expect(Ok, stat);
|
|
stat = GdipSetStringFormatMeasurableCharacterRanges(NULL, 3, ranges);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipSetStringFormatMeasurableCharacterRanges(format, 0, ranges);
|
|
expect(Ok, stat);
|
|
stat = GdipSetStringFormatMeasurableCharacterRanges(format, 3, NULL);
|
|
expect(InvalidParameter, stat);
|
|
|
|
stat = GdipSetStringFormatMeasurableCharacterRanges(format, 3, ranges);
|
|
expect(Ok, stat);
|
|
stat = GdipGetStringFormatMeasurableCharacterRangeCount(format, &count);
|
|
expect(Ok, stat);
|
|
if (stat == Ok) expect(3, count);
|
|
|
|
stat= GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
}
|
|
|
|
static void test_digitsubstitution(void)
|
|
{
|
|
GpStringFormat *format;
|
|
GpStatus stat;
|
|
StringDigitSubstitute digitsub;
|
|
LANGID digitlang;
|
|
|
|
stat = GdipCreateStringFormat(0, LANG_RUSSIAN, &format);
|
|
expect(Ok, stat);
|
|
|
|
/* NULL arguments */
|
|
stat = GdipGetStringFormatDigitSubstitution(NULL, NULL, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatDigitSubstitution(format, NULL, NULL);
|
|
expect(Ok, stat);
|
|
stat = GdipGetStringFormatDigitSubstitution(NULL, &digitlang, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatDigitSubstitution(NULL, NULL, &digitsub);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatDigitSubstitution(NULL, &digitlang, &digitsub);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipSetStringFormatDigitSubstitution(NULL, LANG_NEUTRAL, StringDigitSubstituteNone);
|
|
expect(InvalidParameter, stat);
|
|
|
|
/* try to get both and one by one */
|
|
stat = GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
|
|
expect(Ok, stat);
|
|
expect(StringDigitSubstituteUser, digitsub);
|
|
expect(LANG_NEUTRAL, digitlang);
|
|
|
|
digitsub = StringDigitSubstituteNone;
|
|
stat = GdipGetStringFormatDigitSubstitution(format, NULL, &digitsub);
|
|
expect(Ok, stat);
|
|
expect(StringDigitSubstituteUser, digitsub);
|
|
|
|
digitlang = LANG_RUSSIAN;
|
|
stat = GdipGetStringFormatDigitSubstitution(format, &digitlang, NULL);
|
|
expect(Ok, stat);
|
|
expect(LANG_NEUTRAL, digitlang);
|
|
|
|
/* set/get */
|
|
stat = GdipSetStringFormatDigitSubstitution(format, MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL),
|
|
StringDigitSubstituteUser);
|
|
expect(Ok, stat);
|
|
digitsub = StringDigitSubstituteNone;
|
|
digitlang = LANG_RUSSIAN;
|
|
stat = GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
|
|
expect(Ok, stat);
|
|
expect(StringDigitSubstituteUser, digitsub);
|
|
expect(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), digitlang);
|
|
|
|
stat = GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
}
|
|
|
|
static void test_getgenerictypographic(void)
|
|
{
|
|
GpStringFormat *format, *format2;
|
|
GpStatus stat;
|
|
INT flags;
|
|
INT n;
|
|
StringAlignment align, line_align;
|
|
StringTrimming trimming;
|
|
StringDigitSubstitute digitsub;
|
|
LANGID digitlang;
|
|
INT tabcount;
|
|
|
|
/* NULL arg */
|
|
stat = GdipStringFormatGetGenericTypographic(NULL);
|
|
expect(InvalidParameter, stat);
|
|
|
|
stat = GdipStringFormatGetGenericTypographic(&format);
|
|
expect(Ok, stat);
|
|
|
|
stat = GdipStringFormatGetGenericTypographic(&format2);
|
|
expect(Ok, stat);
|
|
ok(format == format2, "expected same format object\n");
|
|
stat = GdipDeleteStringFormat(format2);
|
|
expect(Ok, stat);
|
|
|
|
GdipGetStringFormatFlags(format, &flags);
|
|
GdipGetStringFormatAlign(format, &align);
|
|
GdipGetStringFormatLineAlign(format, &line_align);
|
|
GdipGetStringFormatHotkeyPrefix(format, &n);
|
|
GdipGetStringFormatTrimming(format, &trimming);
|
|
GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
|
|
GdipGetStringFormatTabStopCount(format, &tabcount);
|
|
|
|
expect((StringFormatFlagsNoFitBlackBox |StringFormatFlagsLineLimit | StringFormatFlagsNoClip),
|
|
flags);
|
|
expect(HotkeyPrefixNone, n);
|
|
expect(StringAlignmentNear, align);
|
|
expect(StringAlignmentNear, line_align);
|
|
expect(StringTrimmingNone, trimming);
|
|
expect(StringDigitSubstituteUser, digitsub);
|
|
expect(LANG_NEUTRAL, digitlang);
|
|
expect(0, tabcount);
|
|
|
|
/* Change format parameters, release, get format object again. */
|
|
stat = GdipSetStringFormatFlags(format, StringFormatFlagsNoWrap);
|
|
expect(Ok, stat);
|
|
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect(StringFormatFlagsNoWrap, flags);
|
|
|
|
stat = GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
|
|
stat = GdipStringFormatGetGenericTypographic(&format);
|
|
expect(Ok, stat);
|
|
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect(StringFormatFlagsNoWrap, flags);
|
|
|
|
stat = GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
}
|
|
|
|
static REAL tabstops[] = {0.0, 10.0, 2.0};
|
|
static void test_tabstops(void)
|
|
{
|
|
GpStringFormat *format;
|
|
GpStatus stat;
|
|
INT count;
|
|
REAL tabs[3];
|
|
REAL firsttab;
|
|
|
|
stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
|
|
expect(Ok, stat);
|
|
|
|
/* NULL */
|
|
stat = GdipGetStringFormatTabStopCount(NULL, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatTabStopCount(NULL, &count);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatTabStopCount(format, NULL);
|
|
expect(InvalidParameter, stat);
|
|
|
|
stat = GdipSetStringFormatTabStops(NULL, 0.0, 0, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipSetStringFormatTabStops(format, 0.0, 0, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipSetStringFormatTabStops(NULL, 0.0, 0, tabstops);
|
|
expect(InvalidParameter, stat);
|
|
|
|
stat = GdipGetStringFormatTabStops(NULL, 0, NULL, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatTabStops(format, 0, NULL, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatTabStops(NULL, 0, &firsttab, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatTabStops(NULL, 0, NULL, tabs);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatTabStops(format, 0, &firsttab, NULL);
|
|
expect(InvalidParameter, stat);
|
|
stat = GdipGetStringFormatTabStops(format, 0, NULL, tabs);
|
|
expect(InvalidParameter, stat);
|
|
|
|
/* not NULL */
|
|
stat = GdipGetStringFormatTabStopCount(format, &count);
|
|
expect(Ok, stat);
|
|
expect(0, count);
|
|
/* negative tabcount */
|
|
stat = GdipSetStringFormatTabStops(format, 0.0, -1, tabstops);
|
|
expect(Ok, stat);
|
|
count = -1;
|
|
stat = GdipGetStringFormatTabStopCount(format, &count);
|
|
expect(Ok, stat);
|
|
expect(0, count);
|
|
|
|
stat = GdipSetStringFormatTabStops(format, -10.0, 0, tabstops);
|
|
expect(Ok, stat);
|
|
stat = GdipSetStringFormatTabStops(format, -10.0, 1, tabstops);
|
|
expect(NotImplemented, stat);
|
|
|
|
firsttab = -1.0;
|
|
tabs[0] = tabs[1] = tabs[2] = -1.0;
|
|
stat = GdipGetStringFormatTabStops(format, 0, &firsttab, tabs);
|
|
expect(Ok, stat);
|
|
expectf(-1.0, tabs[0]);
|
|
expectf(-1.0, tabs[1]);
|
|
expectf(-1.0, tabs[2]);
|
|
expectf(0.0, firsttab);
|
|
|
|
stat = GdipSetStringFormatTabStops(format, +0.0, 3, tabstops);
|
|
expect(Ok, stat);
|
|
count = 0;
|
|
stat = GdipGetStringFormatTabStopCount(format, &count);
|
|
expect(Ok, stat);
|
|
expect(3, count);
|
|
|
|
firsttab = -1.0;
|
|
tabs[0] = tabs[1] = tabs[2] = -1.0;
|
|
stat = GdipGetStringFormatTabStops(format, 3, &firsttab, tabs);
|
|
expect(Ok, stat);
|
|
expectf(0.0, tabs[0]);
|
|
expectf(10.0, tabs[1]);
|
|
expectf(2.0, tabs[2]);
|
|
expectf(0.0, firsttab);
|
|
|
|
stat = GdipSetStringFormatTabStops(format, 10.0, 3, tabstops);
|
|
expect(Ok, stat);
|
|
firsttab = -1.0;
|
|
tabs[0] = tabs[1] = tabs[2] = -1.0;
|
|
stat = GdipGetStringFormatTabStops(format, 0, &firsttab, tabs);
|
|
expect(Ok, stat);
|
|
expectf(-1.0, tabs[0]);
|
|
expectf(-1.0, tabs[1]);
|
|
expectf(-1.0, tabs[2]);
|
|
expectf(10.0, firsttab);
|
|
|
|
/* zero tabcount, after valid setting to 3 */
|
|
stat = GdipSetStringFormatTabStops(format, 0.0, 0, tabstops);
|
|
expect(Ok, stat);
|
|
count = 0;
|
|
stat = GdipGetStringFormatTabStopCount(format, &count);
|
|
expect(Ok, stat);
|
|
expect(3, count);
|
|
|
|
stat = GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
}
|
|
|
|
static void test_getgenericdefault(void)
|
|
{
|
|
GpStringFormat *format, *format2;
|
|
GpStatus stat;
|
|
|
|
INT flags;
|
|
INT n;
|
|
StringAlignment align, line_align;
|
|
StringTrimming trimming;
|
|
StringDigitSubstitute digitsub;
|
|
LANGID digitlang;
|
|
INT tabcount;
|
|
|
|
/* NULL arg */
|
|
stat = GdipStringFormatGetGenericDefault(NULL);
|
|
expect(InvalidParameter, stat);
|
|
|
|
stat = GdipStringFormatGetGenericDefault(&format);
|
|
expect(Ok, stat);
|
|
|
|
stat = GdipStringFormatGetGenericDefault(&format2);
|
|
expect(Ok, stat);
|
|
ok(format == format2, "expected same format object\n");
|
|
stat = GdipDeleteStringFormat(format2);
|
|
expect(Ok, stat);
|
|
|
|
GdipGetStringFormatFlags(format, &flags);
|
|
GdipGetStringFormatAlign(format, &align);
|
|
GdipGetStringFormatLineAlign(format, &line_align);
|
|
GdipGetStringFormatHotkeyPrefix(format, &n);
|
|
GdipGetStringFormatTrimming(format, &trimming);
|
|
GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
|
|
GdipGetStringFormatTabStopCount(format, &tabcount);
|
|
|
|
expect(0, flags);
|
|
expect(HotkeyPrefixNone, n);
|
|
expect(StringAlignmentNear, align);
|
|
expect(StringAlignmentNear, line_align);
|
|
expect(StringTrimmingCharacter, trimming);
|
|
expect(StringDigitSubstituteUser, digitsub);
|
|
expect(LANG_NEUTRAL, digitlang);
|
|
expect(0, tabcount);
|
|
|
|
/* Change default format parameters, release, get format object again. */
|
|
stat = GdipSetStringFormatFlags(format, StringFormatFlagsNoWrap);
|
|
expect(Ok, stat);
|
|
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect(StringFormatFlagsNoWrap, flags);
|
|
|
|
stat = GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
|
|
stat = GdipStringFormatGetGenericDefault(&format);
|
|
expect(Ok, stat);
|
|
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect(StringFormatFlagsNoWrap, flags);
|
|
|
|
stat = GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
}
|
|
|
|
static void test_stringformatflags(void)
|
|
{
|
|
GpStringFormat *format;
|
|
GpStatus stat;
|
|
|
|
INT flags;
|
|
|
|
stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
|
|
expect(Ok, stat);
|
|
|
|
/* NULL args */
|
|
stat = GdipSetStringFormatFlags(NULL, 0);
|
|
expect(InvalidParameter, stat);
|
|
|
|
stat = GdipSetStringFormatFlags(format, 0);
|
|
expect(Ok, stat);
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect(0, flags);
|
|
|
|
/* Check some valid flags */
|
|
stat = GdipSetStringFormatFlags(format, StringFormatFlagsDirectionRightToLeft);
|
|
expect(Ok, stat);
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect(StringFormatFlagsDirectionRightToLeft, flags);
|
|
|
|
stat = GdipSetStringFormatFlags(format, StringFormatFlagsNoFontFallback);
|
|
expect(Ok, stat);
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect(StringFormatFlagsNoFontFallback, flags);
|
|
|
|
/* Check some flag combinations */
|
|
stat = GdipSetStringFormatFlags(format, StringFormatFlagsDirectionVertical
|
|
| StringFormatFlagsNoFitBlackBox);
|
|
expect(Ok, stat);
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect((StringFormatFlagsDirectionVertical
|
|
| StringFormatFlagsNoFitBlackBox), flags);
|
|
|
|
stat = GdipSetStringFormatFlags(format, StringFormatFlagsDisplayFormatControl
|
|
| StringFormatFlagsMeasureTrailingSpaces);
|
|
expect(Ok, stat);
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect((StringFormatFlagsDisplayFormatControl
|
|
| StringFormatFlagsMeasureTrailingSpaces), flags);
|
|
|
|
/* Check invalid flags */
|
|
stat = GdipSetStringFormatFlags(format, 0xdeadbeef);
|
|
expect(Ok, stat);
|
|
stat = GdipGetStringFormatFlags(format, &flags);
|
|
expect(Ok, stat);
|
|
expect(0xdeadbeef, flags);
|
|
|
|
stat = GdipDeleteStringFormat(format);
|
|
expect(Ok, stat);
|
|
}
|
|
|
|
START_TEST(stringformat)
|
|
{
|
|
struct GdiplusStartupInput gdiplusStartupInput;
|
|
ULONG_PTR gdiplusToken;
|
|
HMODULE hmsvcrt;
|
|
int (CDECL * _controlfp_s)(unsigned int *cur, unsigned int newval, unsigned int mask);
|
|
|
|
/* Enable all FP exceptions except _EM_INEXACT, which gdi32 can trigger */
|
|
hmsvcrt = LoadLibraryA("msvcrt");
|
|
_controlfp_s = (void*)GetProcAddress(hmsvcrt, "_controlfp_s");
|
|
if (_controlfp_s) _controlfp_s(0, 0, 0x0008001e);
|
|
|
|
gdiplusStartupInput.GdiplusVersion = 1;
|
|
gdiplusStartupInput.DebugEventCallback = NULL;
|
|
gdiplusStartupInput.SuppressBackgroundThread = 0;
|
|
gdiplusStartupInput.SuppressExternalCodecs = 0;
|
|
|
|
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
|
|
|
|
test_constructor();
|
|
test_characterrange();
|
|
test_digitsubstitution();
|
|
test_getgenerictypographic();
|
|
test_tabstops();
|
|
test_getgenericdefault();
|
|
test_stringformatflags();
|
|
|
|
GdiplusShutdown(gdiplusToken);
|
|
}
|