Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
8f459380
Commit
8f459380
authored
May 09, 2007
by
Kirill K. Smirnov
Committed by
Alexandre Julliard
May 10, 2007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kernel32/tests: Add tests for console screen buffer.
parent
545d7f13
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
197 additions
and
2 deletions
+197
-2
console.c
dlls/kernel32/tests/console.c
+197
-2
No files found.
dlls/kernel32/tests/console.c
View file @
8f459380
...
...
@@ -2,6 +2,7 @@
* Unit tests for console API
*
* Copyright (c) 2003,2004 Eric Pouech
* Copyright (c) 2007 Kirill K. Smirnov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
...
...
@@ -551,6 +552,200 @@ static void testCtrlHandler(void)
ok
(
GetLastError
()
==
ERROR_INVALID_PARAMETER
,
"Bad error %u
\n
"
,
GetLastError
());
}
/*
* Test console screen buffer:
* 1) Try to set invalid handle.
* 2) Try to set non-console handles.
* 3) Use CONOUT$ file as active SB.
* 4) Test cursor.
* 5) Test output codepage to show it is not a property of SB.
* 6) Test switching to old SB if we close all handles to current SB - works
* in Windows, TODO in wine.
*
* What is not tested but should be:
* 1) ScreenBufferInfo
*/
static
void
testScreenBuffer
(
HANDLE
hConOut
)
{
HANDLE
hConOutRW
,
hConOutRO
,
hConOutWT
;
HANDLE
hFileOutRW
,
hFileOutRO
,
hFileOutWT
;
HANDLE
hConOutNew
;
char
test_str1
[]
=
"Test for SB1"
;
char
test_str2
[]
=
"Test for SB2"
;
char
test_cp866
[]
=
{
0xe2
,
0xa5
,
0xe1
,
0xe2
,
0
};
char
test_cp1251
[]
=
{
0xf2
,
0xe5
,
0xf1
,
0xf2
,
0
};
WCHAR
test_unicode
[]
=
{
0x0442
,
0x0435
,
0x0441
,
0x0442
,
0
};
WCHAR
str_wbuf
[
20
];
char
str_buf
[
20
];
DWORD
len
;
COORD
c
;
BOOL
ret
;
DWORD
oldcp
;
/* In the beginning set output codepage to 866 */
oldcp
=
GetConsoleOutputCP
();
ok
(
SetConsoleOutputCP
(
866
),
"Cannot set output codepage to 866
\n
"
);
hConOutRW
=
CreateConsoleScreenBuffer
(
GENERIC_READ
|
GENERIC_WRITE
,
FILE_SHARE_READ
|
FILE_SHARE_WRITE
,
NULL
,
CONSOLE_TEXTMODE_BUFFER
,
NULL
);
ok
(
hConOutRW
!=
INVALID_HANDLE_VALUE
,
"Cannot create a new screen buffer for ReadWrite
\n
"
);
hConOutRO
=
CreateConsoleScreenBuffer
(
GENERIC_READ
,
FILE_SHARE_READ
,
NULL
,
CONSOLE_TEXTMODE_BUFFER
,
NULL
);
ok
(
hConOutRO
!=
INVALID_HANDLE_VALUE
,
"Cannot create a new screen buffer for ReadOnly
\n
"
);
hConOutWT
=
CreateConsoleScreenBuffer
(
GENERIC_WRITE
,
FILE_SHARE_WRITE
,
NULL
,
CONSOLE_TEXTMODE_BUFFER
,
NULL
);
ok
(
hConOutWT
!=
INVALID_HANDLE_VALUE
,
"Cannot create a new screen buffer for WriteOnly
\n
"
);
hFileOutRW
=
CreateFileA
(
"NUL"
,
GENERIC_READ
|
GENERIC_WRITE
,
FILE_SHARE_READ
|
FILE_SHARE_WRITE
,
NULL
,
OPEN_EXISTING
,
0
,
NULL
);
ok
(
hFileOutRW
!=
INVALID_HANDLE_VALUE
,
"Cannot open NUL for ReadWrite
\n
"
);
hFileOutRO
=
CreateFileA
(
"NUL"
,
GENERIC_READ
,
FILE_SHARE_READ
,
NULL
,
OPEN_EXISTING
,
0
,
NULL
);
ok
(
hFileOutRO
!=
INVALID_HANDLE_VALUE
,
"Cannot open NUL for ReadOnly
\n
"
);
hFileOutWT
=
CreateFileA
(
"NUL"
,
GENERIC_WRITE
,
FILE_SHARE_WRITE
,
NULL
,
OPEN_EXISTING
,
0
,
NULL
);
ok
(
hFileOutWT
!=
INVALID_HANDLE_VALUE
,
"Cannot open NUL for WriteOnly
\n
"
);
/* Trying to set invalid handle */
SetLastError
(
0
);
ok
(
!
SetConsoleActiveScreenBuffer
(
INVALID_HANDLE_VALUE
),
"Shouldn't succeed
\n
"
);
ok
(
GetLastError
()
==
ERROR_INVALID_HANDLE
,
"GetLastError: expecting %u got %u
\n
"
,
ERROR_INVALID_HANDLE
,
GetLastError
());
/* Trying to set non-console handles */
SetLastError
(
0
);
ok
(
!
SetConsoleActiveScreenBuffer
(
hFileOutRW
),
"Shouldn't succeed
\n
"
);
ok
(
GetLastError
()
==
ERROR_INVALID_HANDLE
,
"GetLastError: expecting %u got %u
\n
"
,
ERROR_INVALID_HANDLE
,
GetLastError
());
SetLastError
(
0
);
ok
(
!
SetConsoleActiveScreenBuffer
(
hFileOutRO
),
"Shouldn't succeed
\n
"
);
ok
(
GetLastError
()
==
ERROR_INVALID_HANDLE
,
"GetLastError: expecting %u got %u
\n
"
,
ERROR_INVALID_HANDLE
,
GetLastError
());
SetLastError
(
0
);
ok
(
!
SetConsoleActiveScreenBuffer
(
hFileOutWT
),
"Shouldn't succeed
\n
"
);
ok
(
GetLastError
()
==
ERROR_INVALID_HANDLE
,
"GetLastError: expecting %u got %u
\n
"
,
ERROR_INVALID_HANDLE
,
GetLastError
());
CloseHandle
(
hFileOutRW
);
CloseHandle
(
hFileOutRO
);
CloseHandle
(
hFileOutWT
);
/* Trying to set SB handles with various access modes */
SetLastError
(
0
);
ok
(
!
SetConsoleActiveScreenBuffer
(
hConOutRO
),
"Shouldn't succeed
\n
"
);
ok
(
GetLastError
()
==
ERROR_INVALID_HANDLE
,
"GetLastError: expecting %u got %u
\n
"
,
ERROR_INVALID_HANDLE
,
GetLastError
());
ok
(
SetConsoleActiveScreenBuffer
(
hConOutWT
),
"Couldn't set new WriteOnly SB
\n
"
);
ok
(
SetConsoleActiveScreenBuffer
(
hConOutRW
),
"Couldn't set new ReadWrite SB
\n
"
);
CloseHandle
(
hConOutWT
);
CloseHandle
(
hConOutRO
);
/* Now we have two ReadWrite SB, active must be hConOutRW */
/* Open current SB via CONOUT$ */
hConOutNew
=
CreateFileA
(
"CONOUT$"
,
GENERIC_READ
|
GENERIC_WRITE
,
0
,
NULL
,
OPEN_EXISTING
,
0
,
0
);
ok
(
hConOutNew
!=
INVALID_HANDLE_VALUE
,
"CONOUT$ is not opened
\n
"
);
/* test cursor */
c
.
X
=
c
.
Y
=
10
;
SetConsoleCursorPosition
(
hConOut
,
c
);
c
.
X
=
c
.
Y
=
5
;
SetConsoleCursorPosition
(
hConOutRW
,
c
);
okCURSOR
(
hConOutNew
,
c
);
c
.
X
=
c
.
Y
=
10
;
okCURSOR
(
hConOut
,
c
);
c
.
X
=
c
.
Y
=
0
;
/* Write using hConOutNew... */
SetConsoleCursorPosition
(
hConOutNew
,
c
);
ret
=
WriteConsoleA
(
hConOutNew
,
test_str2
,
lstrlenA
(
test_str2
),
&
len
,
NULL
);
ok
(
ret
&&
len
==
lstrlenA
(
test_str2
),
"WriteConsoleA failed
\n
"
);
/* ... and read it back via hConOutRW */
ret
=
ReadConsoleOutputCharacterA
(
hConOutRW
,
str_buf
,
lstrlenA
(
test_str2
),
c
,
&
len
);
ok
(
ret
&&
len
==
lstrlenA
(
test_str2
),
"ReadConsoleOutputCharacterA failed
\n
"
);
str_buf
[
lstrlenA
(
test_str2
)]
=
0
;
ok
(
!
lstrcmpA
(
str_buf
,
test_str2
),
"got '%s' expected '%s'
\n
"
,
str_buf
,
test_str2
);
/* Now test output codepage handling. Current is 866 as we set earlier. */
SetConsoleCursorPosition
(
hConOutRW
,
c
);
ret
=
WriteConsoleA
(
hConOutRW
,
test_cp866
,
lstrlenA
(
test_cp866
),
&
len
,
NULL
);
ok
(
ret
&&
len
==
lstrlenA
(
test_cp866
),
"WriteConsoleA failed
\n
"
);
ret
=
ReadConsoleOutputCharacterW
(
hConOutRW
,
str_wbuf
,
lstrlenA
(
test_cp866
),
c
,
&
len
);
ok
(
ret
&&
len
==
lstrlenA
(
test_cp866
),
"ReadConsoleOutputCharacterW failed
\n
"
);
str_wbuf
[
lstrlenA
(
test_cp866
)]
=
0
;
ok
(
!
lstrcmpW
(
str_wbuf
,
test_unicode
),
"string does not match the pattern
\n
"
);
/*
* cp866 is OK, let's switch to cp1251.
* We expect that this codepage will be used in every SB - active and not.
*/
ok
(
SetConsoleOutputCP
(
1251
),
"Cannot set output cp to 1251
\n
"
);
SetConsoleCursorPosition
(
hConOutRW
,
c
);
ret
=
WriteConsoleA
(
hConOutRW
,
test_cp1251
,
lstrlenA
(
test_cp1251
),
&
len
,
NULL
);
ok
(
ret
&&
len
==
lstrlenA
(
test_cp1251
),
"WriteConsoleA failed
\n
"
);
ret
=
ReadConsoleOutputCharacterW
(
hConOutRW
,
str_wbuf
,
lstrlenA
(
test_cp1251
),
c
,
&
len
);
ok
(
ret
&&
len
==
lstrlenA
(
test_cp1251
),
"ReadConsoleOutputCharacterW failed
\n
"
);
str_wbuf
[
lstrlenA
(
test_cp1251
)]
=
0
;
ok
(
!
lstrcmpW
(
str_wbuf
,
test_unicode
),
"string does not match the pattern
\n
"
);
/* Check what has happened to hConOut. */
SetConsoleCursorPosition
(
hConOut
,
c
);
ret
=
WriteConsoleA
(
hConOut
,
test_cp1251
,
lstrlenA
(
test_cp1251
),
&
len
,
NULL
);
ok
(
ret
&&
len
==
lstrlenA
(
test_cp1251
),
"WriteConsoleA failed
\n
"
);
ret
=
ReadConsoleOutputCharacterW
(
hConOut
,
str_wbuf
,
lstrlenA
(
test_cp1251
),
c
,
&
len
);
ok
(
ret
&&
len
==
lstrlenA
(
test_cp1251
),
"ReadConsoleOutputCharacterW failed
\n
"
);
str_wbuf
[
lstrlenA
(
test_cp1251
)]
=
0
;
ok
(
!
lstrcmpW
(
str_wbuf
,
test_unicode
),
"string does not match the pattern
\n
"
);
/* Close all handles of current console SB */
CloseHandle
(
hConOutNew
);
CloseHandle
(
hConOutRW
);
/* Now active SB should be hConOut */
hConOutNew
=
CreateFileA
(
"CONOUT$"
,
GENERIC_READ
|
GENERIC_WRITE
,
0
,
NULL
,
OPEN_EXISTING
,
0
,
0
);
ok
(
hConOutNew
!=
INVALID_HANDLE_VALUE
,
"CONOUT$ is not opened
\n
"
);
/* Write using hConOutNew... */
SetConsoleCursorPosition
(
hConOutNew
,
c
);
ret
=
WriteConsoleA
(
hConOutNew
,
test_str1
,
lstrlenA
(
test_str1
),
&
len
,
NULL
);
ok
(
ret
&&
len
==
lstrlenA
(
test_str1
),
"WriteConsoleA failed
\n
"
);
/* ... and read it back via hConOut */
ret
=
ReadConsoleOutputCharacterA
(
hConOut
,
str_buf
,
lstrlenA
(
test_str1
),
c
,
&
len
);
ok
(
ret
&&
len
==
lstrlenA
(
test_str1
),
"ReadConsoleOutputCharacterA failed
\n
"
);
str_buf
[
lstrlenA
(
test_str1
)]
=
0
;
todo_wine
ok
(
!
lstrcmpA
(
str_buf
,
test_str1
),
"got '%s' expected '%s'
\n
"
,
str_buf
,
test_str1
);
CloseHandle
(
hConOutNew
);
/* This is not really needed under Windows */
SetConsoleActiveScreenBuffer
(
hConOut
);
/* restore codepage */
SetConsoleOutputCP
(
oldcp
);
}
START_TEST
(
console
)
{
HANDLE
hConIn
,
hConOut
;
...
...
@@ -585,8 +780,8 @@ START_TEST(console)
/* testBottomScroll(); */
/* will test all the scrolling operations */
testScroll
(
hConOut
,
sbi
.
dwSize
);
/* will test sb creation / modification
...
*/
/* testScreenBuffer() */
/* will test sb creation / modification
/ codepage handling
*/
testScreenBuffer
(
hConOut
);
testCtrlHandler
();
/* still to be done: access rights & access on objects */
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment