/* * Unit test suite for pathiterator * * Copyright (C) 2008 Nikolay Sivov * * 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) static void test_constructor_destructor(void) { GpPath *path; GpPathIterator *iter; GpStatus stat; GdipCreatePath(FillModeAlternate, &path); GdipAddPathRectangle(path, 5.0, 5.0, 100.0, 50.0); /* NULL args */ stat = GdipCreatePathIter(NULL, NULL); expect(InvalidParameter, stat); iter = NULL; stat = GdipCreatePathIter(&iter, NULL); expect(Ok, stat); ok(iter != NULL, "Expected iterator to be created\n"); GdipDeletePathIter(iter); stat = GdipCreatePathIter(NULL, path); expect(InvalidParameter, stat); stat = GdipDeletePathIter(NULL); expect(InvalidParameter, stat); /* valid args */ stat = GdipCreatePathIter(&iter, path); expect(Ok, stat); GdipDeletePathIter(iter); GdipDeletePath(path); } static void test_hascurve(void) { GpPath *path; GpPathIterator *iter; GpStatus stat; BOOL hasCurve; GdipCreatePath(FillModeAlternate, &path); GdipAddPathRectangle(path, 5.0, 5.0, 100.0, 50.0); stat = GdipCreatePathIter(&iter, path); expect(Ok, stat); /* NULL args BOOL out argument is local in wrapper class method, so it always has not-NULL address */ stat = GdipPathIterHasCurve(NULL, &hasCurve); expect(InvalidParameter, stat); /* valid args */ stat = GdipPathIterHasCurve(iter, &hasCurve); expect(Ok, stat); expect(FALSE, hasCurve); GdipDeletePathIter(iter); stat = GdipAddPathEllipse(path, 0.0, 0.0, 35.0, 70.0); expect(Ok, stat); stat = GdipCreatePathIter(&iter, path); expect(Ok, stat); stat = GdipPathIterHasCurve(iter, &hasCurve); expect(Ok, stat); expect(TRUE, hasCurve); GdipDeletePathIter(iter); GdipDeletePath(path); } static void test_nextmarker(void) { GpPath *path; GpPathIterator *iter; GpStatus stat; INT start, end; INT result; /* NULL args BOOL out argument is local in wrapper class method, so it always has not-NULL address */ stat = GdipPathIterNextMarker(NULL, &result, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextMarker(NULL, &result, &start, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextMarker(NULL, &result, NULL, &end); expect(InvalidParameter, stat); GdipCreatePath(FillModeAlternate, &path); GdipAddPathRectangle(path, 5.0, 5.0, 100.0, 50.0); /* no markers */ GdipCreatePathIter(&iter, path); start = end = result = (INT)0xdeadbeef; stat = GdipPathIterNextMarker(iter, &result, &start, &end); expect(Ok, stat); expect(0, start); expect(3, end); expect(4, result); start = end = result = (INT)0xdeadbeef; stat = GdipPathIterNextMarker(iter, &result, &start, &end); expect(Ok, stat); /* start/end remain unchanged */ expect((INT)0xdeadbeef, start); expect((INT)0xdeadbeef, end); expect(0, result); GdipDeletePathIter(iter); /* one marker */ GdipSetPathMarker(path); GdipCreatePathIter(&iter, path); start = end = result = (INT)0xdeadbeef; stat = GdipPathIterNextMarker(iter, &result, &start, &end); expect(Ok, stat); expect(0, start); expect(3, end); expect(4, result); start = end = result = (INT)0xdeadbeef; stat = GdipPathIterNextMarker(iter, &result, &start, &end); expect(Ok, stat); expect((INT)0xdeadbeef, start); expect((INT)0xdeadbeef, end); expect(0, result); GdipDeletePathIter(iter); /* two markers */ GdipAddPathLine(path, 0.0, 0.0, 10.0, 30.0); GdipSetPathMarker(path); GdipCreatePathIter(&iter, path); start = end = result = (INT)0xdeadbeef; stat = GdipPathIterNextMarker(iter, &result, &start, &end); expect(Ok, stat); expect(0, start); expect(3, end); expect(4, result); start = end = result = (INT)0xdeadbeef; stat = GdipPathIterNextMarker(iter, &result, &start, &end); expect(Ok, stat); expect(4, start); expect(5, end); expect(2, result); start = end = result = (INT)0xdeadbeef; stat = GdipPathIterNextMarker(iter, &result, &start, &end); expect(Ok, stat); expect((INT)0xdeadbeef, start); expect((INT)0xdeadbeef, end); expect(0, result); GdipDeletePathIter(iter); GdipDeletePath(path); } static void test_nextmarkerpath(void) { GpPath *path, *retpath; GpPathIterator *iter; GpStatus stat; INT result, count; GdipCreatePath(FillModeAlternate, &path); /* NULL */ stat = GdipPathIterNextMarkerPath(NULL, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextMarkerPath(NULL, &result, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextMarkerPath(NULL, &result, path); expect(InvalidParameter, stat); GdipAddPathRectangle(path, 5.0, 5.0, 100.0, 50.0); /* no markers */ GdipCreatePath(FillModeAlternate, &retpath); GdipCreatePathIter(&iter, path); result = -1; stat = GdipPathIterNextMarkerPath(iter, &result, retpath); expect(Ok, stat); expect(4, result); count = -1; GdipGetPointCount(retpath, &count); expect(4, count); result = -1; stat = GdipPathIterNextMarkerPath(iter, &result, retpath); expect(Ok, stat); expect(0, result); count = -1; GdipGetPointCount(retpath, &count); expect(4, count); GdipDeletePathIter(iter); GdipDeletePath(retpath); /* one marker */ GdipSetPathMarker(path); GdipCreatePath(FillModeAlternate, &retpath); GdipCreatePathIter(&iter, path); result = -1; stat = GdipPathIterNextMarkerPath(iter, &result, retpath); expect(Ok, stat); expect(4, result); count = -1; GdipGetPointCount(retpath, &count); expect(4, count); result = -1; stat = GdipPathIterNextMarkerPath(iter, &result, retpath); expect(Ok, stat); expect(0, result); count = -1; GdipGetPointCount(retpath, &count); expect(4, count); GdipDeletePathIter(iter); GdipDeletePath(retpath); /* two markers */ GdipAddPathLine(path, 0.0, 0.0, 10.0, 30.0); GdipSetPathMarker(path); GdipCreatePath(FillModeAlternate, &retpath); GdipCreatePathIter(&iter, path); result = -1; stat = GdipPathIterNextMarkerPath(iter, &result, retpath); expect(Ok, stat); expect(4, result); result = -1; stat = GdipPathIterNextMarkerPath(iter, &result, retpath); expect(Ok, stat); expect(2, result); result = -1; stat = GdipPathIterNextMarkerPath(iter, &result, retpath); expect(Ok, stat); expect(0, result); GdipDeletePathIter(iter); GdipDeletePath(retpath); GdipDeletePath(path); } static void test_getsubpathcount(void) { GpPath *path; GpPathIterator *iter; GpStatus stat; INT count; /* NULL args */ stat = GdipPathIterGetSubpathCount(NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterGetSubpathCount(NULL, &count); expect(InvalidParameter, stat); GdipCreatePath(FillModeAlternate, &path); /* empty path */ GdipCreatePathIter(&iter, path); stat = GdipPathIterGetSubpathCount(iter, &count); expect(Ok, stat); expect(0, count); GdipDeletePathIter(iter); GdipAddPathLine(path, 5.0, 5.0, 100.0, 50.0); /* open figure */ GdipCreatePathIter(&iter, path); stat = GdipPathIterGetSubpathCount(iter, &count); expect(Ok, stat); expect(1, count); GdipDeletePathIter(iter); /* manually start new figure */ GdipStartPathFigure(path); GdipAddPathLine(path, 50.0, 50.0, 110.0, 40.0); GdipCreatePathIter(&iter, path); stat = GdipPathIterGetSubpathCount(iter, &count); expect(Ok, stat); expect(2, count); GdipDeletePathIter(iter); GdipDeletePath(path); } static void test_isvalid(void) { GpPath *path; GpPathIterator *iter; GpStatus stat; BOOL isvalid; INT start, end, result; GdipCreatePath(FillModeAlternate, &path); /* NULL args */ GdipCreatePathIter(&iter, path); stat = GdipPathIterIsValid(NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterIsValid(iter, NULL); expect(InvalidParameter, stat); stat = GdipPathIterIsValid(NULL, &isvalid); expect(InvalidParameter, stat); GdipDeletePathIter(iter); /* on empty path */ GdipCreatePathIter(&iter, path); isvalid = FALSE; stat = GdipPathIterIsValid(iter, &isvalid); expect(Ok, stat); expect(TRUE, isvalid); GdipDeletePathIter(iter); /* no markers */ stat = GdipAddPathLine(path, 50.0, 50.0, 110.0, 40.0); expect(Ok, stat); stat = GdipCreatePathIter(&iter, path); expect(Ok, stat); stat = GdipPathIterNextMarker(iter, &result, &start, &end); expect(Ok, stat); isvalid = FALSE; stat = GdipPathIterIsValid(iter, &isvalid); expect(Ok, stat); expect(TRUE, isvalid); GdipDeletePathIter(iter); GdipDeletePath(path); } static void test_nextsubpathpath(void) { GpPath *path, *retpath; GpPathIterator *iter; GpStatus stat; BOOL closed; INT count, result; GdipCreatePath(FillModeAlternate, &path); /* NULL args */ GdipCreatePath(FillModeAlternate, &retpath); GdipCreatePathIter(&iter, path); stat = GdipPathIterNextSubpathPath(NULL, NULL, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextSubpathPath(iter, NULL, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextSubpathPath(NULL, &result, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextSubpathPath(iter, &result, NULL, &closed); expect(Ok, stat); stat = GdipPathIterNextSubpathPath(iter, NULL, NULL, &closed); expect(InvalidParameter, stat); stat = GdipPathIterNextSubpathPath(iter, NULL, retpath, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextSubpathPath(iter, &result, retpath, NULL); expect(InvalidParameter, stat); GdipDeletePathIter(iter); GdipDeletePath(retpath); /* empty path */ GdipCreatePath(FillModeAlternate, &retpath); GdipCreatePathIter(&iter, path); result = -2; closed = TRUE; stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed); expect(Ok, stat); expect(0, result); expect(TRUE, closed); count = -1; GdipGetPointCount(retpath, &count); expect(0, count); GdipDeletePathIter(iter); GdipDeletePath(retpath); /* open figure */ GdipAddPathLine(path, 5.0, 5.0, 100.0, 50.0); GdipCreatePath(FillModeAlternate, &retpath); GdipCreatePathIter(&iter, path); result = -2; closed = TRUE; stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed); expect(Ok, stat); expect(2, result); expect(FALSE, closed); count = -1; GdipGetPointCount(retpath, &count); expect(2, count); /* subsequent call */ result = -2; closed = TRUE; stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed); expect(Ok, stat); expect(0, result); expect(TRUE, closed); count = -1; GdipGetPointCount(retpath, &count); expect(2, count); GdipDeletePathIter(iter); /* closed figure, check does it extend retpath or reset it */ GdipAddPathLine(retpath, 50.0, 55.0, 200.0, 150.0); GdipClosePathFigure(path); GdipAddPathLine(path, 50.0, 55.0, 200.0, 150.0); GdipClosePathFigure(path); GdipCreatePathIter(&iter, path); result = -2; closed = FALSE; stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed); expect(Ok, stat); expect(2, result); expect(TRUE, closed); count = -1; GdipGetPointCount(retpath, &count); expect(2, count); /* subsequent call */ result = -2; closed = FALSE; stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed); expect(Ok, stat); expect(2, result); expect(TRUE, closed); count = -1; GdipGetPointCount(retpath, &count); expect(2, count); result = -2; closed = FALSE; stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed); expect(Ok, stat); expect(0, result); expect(TRUE, closed); count = -1; GdipGetPointCount(retpath, &count); expect(2, count); GdipDeletePathIter(iter); GdipDeletePath(retpath); GdipDeletePath(path); } static void test_nextsubpath(void) { GpPath *path; GpPathIterator *iter; GpStatus stat; INT start, end, result; BOOL closed; /* empty path */ GdipCreatePath(FillModeAlternate, &path); GdipCreatePathIter(&iter, path); result = -2; closed = TRUE; stat = GdipPathIterNextSubpath(iter, &result, &start, &end, &closed); expect(Ok, stat); expect(0, result); expect(TRUE, closed); GdipDeletePathIter(iter); GdipDeletePath(path); } static void test_nextpathtype(void) { GpPath *path; GpPathIterator *iter; GpStatus stat; INT start, end, result; BYTE type; GdipCreatePath(FillModeAlternate, &path); GdipCreatePathIter(&iter, path); /* NULL arguments */ stat = GdipPathIterNextPathType(NULL, NULL, NULL, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextPathType(iter, NULL, NULL, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextPathType(iter, &result, NULL, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextPathType(iter, NULL, &type, NULL, NULL); expect(InvalidParameter, stat); stat = GdipPathIterNextPathType(iter, NULL, NULL, &start, &end); expect(InvalidParameter, stat); stat = GdipPathIterNextPathType(iter, NULL, &type, &start, &end); expect(InvalidParameter, stat); stat = GdipPathIterNextPathType(iter, &result, &type, NULL, NULL); expect(InvalidParameter, stat); /* empty path */ start = end = result = (INT)0xdeadbeef; stat = GdipPathIterNextPathType(iter, &result, &type, &start, &end); todo_wine expect(Ok, stat); expect((INT)0xdeadbeef, start); expect((INT)0xdeadbeef, end); todo_wine expect(0, result); GdipDeletePathIter(iter); /* single figure */ GdipAddPathLine(path, 0.0, 0.0, 10.0, 30.0); GdipCreatePathIter(&iter, path); start = end = result = (INT)0xdeadbeef; type = 255; /* out of range */ stat = GdipPathIterNextPathType(iter, &result, &type, &start, &end); todo_wine expect(Ok, stat); expect((INT)0xdeadbeef, start); expect((INT)0xdeadbeef, end); expect(255, type); todo_wine expect(0, result); GdipDeletePathIter(iter); stat = GdipAddPathEllipse(path, 0.0, 0.0, 35.0, 70.0); expect(Ok, stat); GdipCreatePathIter(&iter, path); start = end = result = (INT)0xdeadbeef; type = 255; /* out of range */ stat = GdipPathIterNextPathType(iter, &result, &type, &start, &end); todo_wine expect(Ok, stat); expect((INT)0xdeadbeef, start); expect((INT)0xdeadbeef, end); expect(255, type); todo_wine expect(0, result); GdipDeletePathIter(iter); /* closed */ GdipClosePathFigure(path); GdipCreatePathIter(&iter, path); start = end = result = (INT)0xdeadbeef; type = 255; /* out of range */ stat = GdipPathIterNextPathType(iter, &result, &type, &start, &end); todo_wine expect(Ok, stat); expect((INT)0xdeadbeef, start); expect((INT)0xdeadbeef, end); expect(255, type); todo_wine expect(0, result); GdipDeletePathIter(iter); GdipDeletePath(path); } START_TEST(pathiterator) { 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_destructor(); test_hascurve(); test_nextmarker(); test_nextmarkerpath(); test_getsubpathcount(); test_isvalid(); test_nextsubpathpath(); test_nextsubpath(); test_nextpathtype(); GdiplusShutdown(gdiplusToken); }