wine-wine/dlls/gdiplus/tests/stringformat.c

466 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);
}