fake_display for unit tests

added first get_save_name dialog test case
This commit is contained in:
Pauli Nieminen 2008-07-04 22:43:05 +00:00
parent e65a745ea9
commit 47fb8ac6af
11 changed files with 165 additions and 49 deletions

View file

@ -320,6 +320,7 @@ env.WesnothProgram("exploder", exploder_sources + [libcutter, libwesnoth_core, l
test_utils_sources = Split("""
tests/utils/fake_event_source.cpp
tests/utils/fake_display.cpp
""")
libtest_utils = env.Library("test_utils", test_utils_sources)

View file

@ -706,8 +706,8 @@ int dialog::process(dialog_process_info &info)
const bool use_text_input = (text_widget_!=NULL);
const bool has_input = (use_menu||use_text_input);//input of any sort has to be made
if(((!info.key_down && info.key[SDLK_RETURN]) || info.key[SDLK_KP_ENTER] || info.double_clicked) &&
(type_ == YES_NO || type_ == OK_CANCEL || type_ == OK_ONLY || type_ == CLOSE_ONLY)) {
if(((!info.key_down && (info.key[SDLK_RETURN] || info.key[SDLK_KP_ENTER]) || info.double_clicked) &&
(type_ == YES_NO || type_ == OK_CANCEL || type_ == OK_ONLY || type_ == CLOSE_ONLY))) {
return (use_menu ? menu_->selection() : 0);
}

View file

@ -122,7 +122,9 @@ display::display(CVideo& video, const gamemap& map, const config& theme_cfg, con
idle_anim_rate_(1.0),
map_screenshot_surf_(NULL)
{
if(non_interactive()) {
if(non_interactive()
&& (get_video_surface() != NULL
&& video.faked())) {
screen_.lock_updates(true);
}

View file

@ -25,7 +25,7 @@ CKey::CKey() :
int CKey::operator[]( int code ) const
{
return (code == SDLK_ESCAPE || is_enabled) && int(key_list[code]);
return int(key_list[code]);
}
void CKey::SetEnabled( bool enable )

View file

@ -20,7 +20,9 @@
#include "game_errors.hpp"
#include "network.hpp"
#include "config.hpp"
#include "log.hpp"
#include "tests/utils/fake_display.hpp"
/**
* @todo: add all others exception handlers too
**/
@ -44,6 +46,10 @@ struct wesnoth_global_fixture {
wesnoth_global_fixture()
{
SDL_Init(SDL_INIT_TIMER);
test_utils::get_fake_display();
// lg::set_log_domain_severity("all",3);
if (boost::unit_test::runtime_config::log_level() < boost::unit_test::log_messages)
boost::unit_test::unit_test_log.set_threshold_level( boost::unit_test::log_messages );
BOOST_MESSAGE("Initializing test!");

View file

@ -14,13 +14,15 @@
#include <boost/test/auto_unit_test.hpp>
#include "key.hpp"
#include "unit_types.hpp"
#include "dialogs.hpp"
#include "key.hpp"
#include "filesystem.hpp"
#include "gamestatus.hpp"
#include "unit_types.hpp"
//
#include "tests/utils/fake_event_source.hpp"
#include "tests/utils/fake_display.hpp"
// Linker workarounds start here
@ -30,7 +32,6 @@
#include "config.hpp"
#include "serialization/parser.hpp"
#include "serialization/preprocessor.hpp"
#include "filesystem.hpp"
#include "sdl_utils.hpp"
#include "game_events.hpp"
#include "network.hpp"
@ -53,47 +54,36 @@ WML_HANDLER_FUNCTION(test_sources, , , )
namespace test {
struct endlevel_fixture {
struct save_dialog_fixture {
test_utils::fake_event_source source;
SDL_Event event;
};
BOOST_FIXTURE_TEST_SUITE( endlevel , endlevel_fixture)
BOOST_FIXTURE_TEST_SUITE( save_dialog , save_dialog_fixture)
BOOST_AUTO_TEST_CASE( test_fake_input )
{
BOOST_MESSAGE("Starting endlevel test!");
event.type = SDL_KEYDOWN;
event.key.state = SDL_PRESSED;
event.key.keysym.sym = SDLK_ESCAPE;
event.key.keysym.scancode = 65;
event.key.keysym.mod = KMOD_NONE;
event.key.keysym.unicode = 0;
test_utils::event_node_ptr new_keypress(new test_utils::event_node_keyboard(3, event));
event.type = SDL_KEYUP;
event.key.state = SDL_RELEASED;
test_utils::event_node_ptr new_keyrelease(new test_utils::event_node_keyboard(5, event));
source.add_event(new_keypress);
source.add_event(new_keyrelease);
test_utils::event_node_ptr new_keypress = source.press_key(2, SDLK_RETURN);
test_utils::event_node_ptr new_keyrelease = source.release_key(4, SDLK_RETURN);
CKey key;
source.start();
while(true)
{
events::pump();
BOOST_CHECK_EQUAL(key[SDLK_ESCAPE], new_keypress->is_fired());
if (key[SDLK_ESCAPE])
BOOST_CHECK_EQUAL(key[SDLK_RETURN], new_keypress->is_fired());
if (key[SDLK_RETURN])
break;
}
while(true)
{
events::pump();
BOOST_CHECK_EQUAL(key[SDLK_ESCAPE], !new_keyrelease->is_fired());
if (!key[SDLK_ESCAPE])
BOOST_CHECK_EQUAL(key[SDLK_RETURN], !new_keyrelease->is_fired());
if (!key[SDLK_RETURN])
break;
}
}
@ -102,24 +92,16 @@ namespace test {
{
// fill in events to be used in test
test_utils::event_node_ptr press_return_before = source.press_key(0, SDLK_RETURN);
test_utils::event_node_ptr release_return_before = source.release_key(3, SDLK_RETURN);
test_utils::event_node_ptr press_return_after = source.press_key(6, SDLK_RETURN);
test_utils::event_node_ptr release_return_after = source.release_key(9, SDLK_RETURN);
test_utils::event_node_ptr release_return_before = source.release_key(200, SDLK_RETURN);
test_utils::event_node_ptr press_return_after = source.press_key(240, SDLK_RETURN);
test_utils::event_node_ptr release_return_after = source.release_key(1000, SDLK_RETURN);
// Just to make sure no forever loops happening
source.press_key(1100, SDLK_RETURN);
source.release_key(1200, SDLK_RETURN);
CVideo video_;
video_.make_test_fake();
unit_map dummy_umap;
config dummy_cfg;
gamemap dummy_map(dummy_cfg, "");
gamestatus dummy_status(dummy_cfg, 0);
std::vector<team> dummy_teams;
const events::event_context main_event_context_;
game_display disp(dummy_umap, video_, dummy_map, dummy_status,
dummy_teams, dummy_cfg, dummy_cfg, dummy_cfg);
std::string fname("press_enter");
write_file(get_saves_dir() + "/" + fname +".gz", "böö");
// Start test (set ticks start time)
source.start();
// Activated enter press
@ -128,7 +110,7 @@ namespace test {
BOOST_CHECK_MESSAGE(press_return_before->is_fired(), "Enter wasn't activated");
BOOST_CHECK_MESSAGE(!release_return_before->is_fired(), "Enter was released before test");
BOOST_CHECK_EQUAL(dialogs::get_save_name(disp, "Save game?", "file", &fname,gui::OK_CANCEL, "Save game", false, true), 0);
BOOST_CHECK_EQUAL(dialogs::get_save_name(test_utils::get_fake_display(), "Save game?", "file", &fname,gui::OK_CANCEL, "Save game", false, false), 0);
BOOST_CHECK_MESSAGE(release_return_before->is_fired(), "get_save_name returned before releasing first enter.");
BOOST_CHECK_MESSAGE(press_return_after->is_fired(), "get_save_name returned before 2nd enter event was sent");

View file

@ -0,0 +1,83 @@
/* $Id$ */
/*
Copyright (C) 2008 by Pauli Nieminen <paniemin@cc.hut.fi>
Part of the Battle for Wesnoth Project http://www.wesnoth.org/
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2
or at your option any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY.
See the COPYING file for more details.
*/
#include <iostream>
#include "tests/utils/fake_display.hpp"
#include "game_display.hpp"
#include "video.hpp"
#include "config.hpp"
#include "unit_types.hpp"
#include "gamestatus.hpp"
namespace test_utils {
class fake_display_manager {
static fake_display_manager* manager_;
CVideo video_;
unit_map dummy_umap_;
config dummy_cfg_;
gamemap dummy_map_;
gamestatus dummy_status_;
std::vector<team> dummy_teams_;
const events::event_context main_event_context_;
game_display disp_;
public:
static fake_display_manager* get_manager();
game_display& get_display();
fake_display_manager();
// ~fake_display_manager();
};
fake_display_manager* fake_display_manager::manager_ = 0;
fake_display_manager* fake_display_manager::get_manager()
{
if (!manager_)
{
manager_ = new fake_display_manager();
}
return manager_;
}
fake_display_manager::fake_display_manager() :
video_(CVideo::FAKE_TEST),
dummy_umap_(),
dummy_cfg_(),
dummy_map_(dummy_cfg_,""),
dummy_status_(dummy_cfg_, 0),
dummy_teams_(),
main_event_context_(),
disp_(dummy_umap_, video_, dummy_map_, dummy_status_,
dummy_teams_, dummy_cfg_, dummy_cfg_, dummy_cfg_)
{
}
game_display& fake_display_manager::get_display()
{
return disp_;
}
game_display& get_fake_display()
{
return fake_display_manager::get_manager()->get_display();
}
}

View file

@ -0,0 +1,26 @@
/* $Id$ */
/*
Copyright (C) 2008 by Pauli Nieminen <paniemin@cc.hut.fi>
Part of the Battle for Wesnoth Project http://www.wesnoth.org/
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2
or at your option any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY.
See the COPYING file for more details.
*/
#ifndef TESTS_UTILS_FAKE_DISPLAY_HPP_INCLUDED
#define TESTS_UTILS_FAKE_DISPLAY_HPP_INCLUDED
class game_display;
namespace test_utils {
game_display& get_fake_display();
}
#endif

View file

@ -60,9 +60,9 @@ namespace test_utils {
static int num_keys = 300;
Uint8* key_list = SDL_GetKeyState( &num_keys );
if (event_.type == SDL_KEYDOWN)
key_list[SDLK_ESCAPE] = 5;
key_list[event_.key.keysym.sym] = 1;
else
key_list[SDLK_ESCAPE] = 0;
key_list[event_.key.keysym.sym] = 0;
}
fake_event_source::fake_event_source() : start_time_(SDL_GetTicks())

View file

@ -230,7 +230,7 @@ void update_whole_screen()
{
update_all = true;
}
CVideo::CVideo() : mode_changed_(false), bpp_(0), fake_screen_(false), help_string_(0), updatesLocked_(0)
CVideo::CVideo(FAKE_TYPES type) : mode_changed_(false), bpp_(0), fake_screen_(false), help_string_(0), updatesLocked_(0)
{
const int res = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
@ -238,6 +238,17 @@ CVideo::CVideo() : mode_changed_(false), bpp_(0), fake_screen_(false), help_stri
ERR_DP << "Could not initialize SDL: " << SDL_GetError() << "\n";
throw CVideo::error();
}
switch(type)
{
case NO_FAKE:
break;
case FAKE:
make_fake();
break;
case FAKE_TEST:
make_test_fake();
break;
}
}
CVideo::CVideo( int x, int y, int bits_per_pixel, int flags)

View file

@ -36,7 +36,12 @@ void update_whole_screen();
class CVideo {
public:
CVideo();
enum FAKE_TYPES {
NO_FAKE,
FAKE,
FAKE_TEST
};
CVideo(FAKE_TYPES type = NO_FAKE);
CVideo(int x, int y, int bits_per_pixel, int flags);
~CVideo();