Merge lp:~compiz-team/compiz/compiz.fix_1058577 into lp:compiz/0.9.9

Proposed by Sam Spilsbury
Status: Merged
Approved by: Daniel van Vugt
Approved revision: 3408
Merged at revision: 3413
Proposed branch: lp:~compiz-team/compiz/compiz.fix_1058577
Merge into: lp:compiz/0.9.9
Diff against target: 500 lines (+371/-26)
5 files modified
compizconfig/libcompizconfig/src/bindings.c (+52/-26)
compizconfig/libcompizconfig/src/ccs-modifier-list-inl.h (+50/-0)
compizconfig/libcompizconfig/src/ccs-private.h (+19/-0)
compizconfig/libcompizconfig/tests/CMakeLists.txt (+12/-0)
compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp (+238/-0)
To merge this branch: bzr merge lp:~compiz-team/compiz/compiz.fix_1058577
Reviewer Review Type Date Requested Status
Daniel van Vugt Approve
jenkins (community) continuous-integration Needs Fixing
Sam Spilsbury Approve
Review via email: mp+128924@code.launchpad.net

This proposal supersedes a proposal from 2012-10-10.

Commit message

Added tests for the StringToModifiers and ModifiersToString code, move the
code which detects <Primary> as ControlMask upstream and use two functions to
ensure that duplicates aren't added.

Fixes Jenkins failures. (LP: #1058577)

Description of the change

Added tests for the StringToModifiers and ModifiersToString code, move the code which detects <Primary> as ControlMask upstream and use two functions to ensure that duplicates aren't added.

Two tests were failing in bug 1058577 because both <Control> and <Primary> were added to the modifier string instead of just <Control>.

To post a comment you must log in.
Revision history for this message
Sam Spilsbury (smspillaz) wrote : Posted in a previous version of this proposal

Note, jenkins will probably mark this needs fixing because of conflicts with a distro patch. That distro patch should be dropped as its effectively made redundant by this branch.

Revision history for this message
jenkins (martin-mrazik+qa) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote : Posted in a previous version of this proposal
Download full text (5.3 KiB)

Sorry, but gcc sucks at template error messages:

[ 40%] Building CXX object compizconfig/libcompizconfig/tests/CMakeFiles/compizconfig_test_ccs_util.dir/compizconfig_test_ccs_util.cpp.o
In file included from /usr/include/c++/4.6/vector:70:0,
                 from /usr/include/gtest/gtest.h:55,
                 from /home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp:22:
/usr/include/c++/4.6/bits/vector.tcc: In member function ‘void std::vector<_Tp, _Alloc>::_M_insert_aux(std::vector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {{anonymous}::ModifierParam}, _Tp = {anonymous}::ModifierParam, _Alloc = std::allocator<{anonymous}::ModifierParam>, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<{anonymous}::ModifierParam*, std::vector<{anonymous}::ModifierParam> >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer = {anonymous}::ModifierParam*]’:
/usr/include/c++/4.6/bits/vector.tcc:102:4: instantiated from ‘void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {{anonymous}::ModifierParam}, _Tp = {anonymous}::ModifierParam, _Alloc = std::allocator<{anonymous}::ModifierParam>]’
/usr/include/c++/4.6/bits/stl_vector.h:840:9: instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = {anonymous}::ModifierParam, _Alloc = std::allocator<{anonymous}::ModifierParam>, std::vector<_Tp, _Alloc>::value_type = {anonymous}::ModifierParam]’
/home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp:131:22: instantiated from here
/usr/include/c++/4.6/bits/vector.tcc:319:4: error: use of deleted function ‘{anonymous}::ModifierParam& {anonymous}::ModifierParam::operator=(const {anonymous}::ModifierParam&)’
/home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp:94:11: error: ‘{anonymous}::ModifierParam& {anonymous}::ModifierParam::operator=(const {anonymous}::ModifierParam&)’ is implicitly deleted because the default definition would be ill-formed:
/home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp:94:11: error: passing ‘const string {aka const std::basic_string<char>}’ as ‘this’ argument of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]’ discards qualifiers [-fpermissive]
In file included from /usr/include/c++/4.6/vector:61:0,
                 from /usr/include/gtest/gtest.h:55,
                 from /home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp:22:
/usr/include/c++/4.6/bits/stl_algobase.h: In static member function ‘static _BI2 std::__copy_move_backward<true, false, std::random_access_iterator_tag>::__copy_move_b(_BI1, _BI1, _BI2) [with _BI1 = {anonymous}::ModifierParam*, _BI2 = {anonymous}::ModifierParam*]’:
/usr/include/c++/4.6/bits/stl_algobase.h:581:18: instantiated from ‘_BI2 std::_...

Read more...

review: Needs Fixing
Revision history for this message
Sam Spilsbury (smspillaz) wrote : Posted in a previous version of this proposal
Download full text (5.6 KiB)

> Sorry, but gcc sucks at template error messages:
>
> [ 40%] Building CXX object compizconfig/libcompizconfig/tests/CMakeFiles/compi
> zconfig_test_ccs_util.dir/compizconfig_test_ccs_util.cpp.o
> In file included from /usr/include/c++/4.6/vector:70:0,
> from /usr/include/gtest/gtest.h:55,
> from /home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfi
> g/tests/compizconfig_test_ccs_util.cpp:22:
> /usr/include/c++/4.6/bits/vector.tcc: In member function ‘void
> std::vector<_Tp, _Alloc>::_M_insert_aux(std::vector<_Tp, _Alloc>::iterator,
> _Args&& ...) [with _Args = {{anonymous}::ModifierParam}, _Tp =
> {anonymous}::ModifierParam, _Alloc =
> std::allocator<{anonymous}::ModifierParam>, std::vector<_Tp, _Alloc>::iterator
> = __gnu_cxx::__normal_iterator<{anonymous}::ModifierParam*,
> std::vector<{anonymous}::ModifierParam> >, typename std::_Vector_base<_Tp,
> _Alloc>::_Tp_alloc_type::pointer = {anonymous}::ModifierParam*]’:
> /usr/include/c++/4.6/bits/vector.tcc:102:4: instantiated from ‘void
> std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args =
> {{anonymous}::ModifierParam}, _Tp = {anonymous}::ModifierParam, _Alloc =
> std::allocator<{anonymous}::ModifierParam>]’
> /usr/include/c++/4.6/bits/stl_vector.h:840:9: instantiated from ‘void
> std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&)
> [with _Tp = {anonymous}::ModifierParam, _Alloc =
> std::allocator<{anonymous}::ModifierParam>, std::vector<_Tp,
> _Alloc>::value_type = {anonymous}::ModifierParam]’
> /home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfig/tests/compizconfig_t
> est_ccs_util.cpp:131:22: instantiated from here
> /usr/include/c++/4.6/bits/vector.tcc:319:4: error: use of deleted function
> ‘{anonymous}::ModifierParam& {anonymous}::ModifierParam::operator=(const
> {anonymous}::ModifierParam&)’
> /home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfig/tests/compizconfig_t
> est_ccs_util.cpp:94:11: error: ‘{anonymous}::ModifierParam&
> {anonymous}::ModifierParam::operator=(const {anonymous}::ModifierParam&)’ is
> implicitly deleted because the default definition would be ill-formed:
> /home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfig/tests/compizconfig_t
> est_ccs_util.cpp:94:11: error: passing ‘const string {aka const
> std::basic_string<char>}’ as ‘this’ argument of ‘std::basic_string<_CharT,
> _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const
> std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits =
> std::char_traits<char>, _Alloc = std::allocator<char>,
> std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]’
> discards qualifiers [-fpermissive]
> In file included from /usr/include/c++/4.6/vector:61:0,
> from /usr/include/gtest/gtest.h:55,
> from /home/dan/bzr/compiz/tmp.577/compizconfig/libcompizconfi
> g/tests/compizconfig_test_ccs_util.cpp:22:
> /usr/include/c++/4.6/bits/stl_algobase.h: In static member function ‘static
> _BI2 std::__copy_move_backward<true, false,
> std::random_access_iterator_tag>::__copy_move_b(_BI1, _BI1, _BI2) [with _BI1 =
> {anonymous}::ModifierParam*, _BI2 = {anony...

Read more...

Revision history for this message
Daniel van Vugt (vanvugt) wrote : Posted in a previous version of this proposal

And I tried clang to get better error messages. But hit bug 1060804 instead.

Revision history for this message
Sam Spilsbury (smspillaz) wrote : Posted in a previous version of this proposal

I cannot reproduce this compiler error but I've implemented copying semantics for the offending struct.

Revision history for this message
Daniel van Vugt (vanvugt) wrote : Posted in a previous version of this proposal

Seems OK now.

review: Approve
Revision history for this message
jenkins (martin-mrazik+qa) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
Sam Spilsbury (smspillaz) wrote : Posted in a previous version of this proposal

Note that tarmac will probably reject this due to the distro patch

Revision history for this message
Unity Merger (unity-merger) wrote : Posted in a previous version of this proposal

The Jenkins job https://jenkins.qa.ubuntu.com/job/automerge-compiz-core/308/console reported an error when processing this lp:~compiz-team/compiz/compiz.fix_1058577 branch.
Not merging it.

Revision history for this message
Sam Spilsbury (smspillaz) wrote : Posted in a previous version of this proposal

I think jenkins is using the new packaging repo with the removed conflicting patch, resubmitting.

Revision history for this message
Sam Spilsbury (smspillaz) wrote : Posted in a previous version of this proposal

As above

review: Approve
Revision history for this message
jenkins (martin-mrazik+qa) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
jenkins (martin-mrazik+qa) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
Sam Spilsbury (smspillaz) :
review: Approve
Revision history for this message
jenkins (martin-mrazik+qa) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Isn't this the same revision I approved already in a different submission?

review: Approve
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

P.S. Jenkins can't ever pass until the similar distro patch is removed from lp:ubuntu/compiz: primary_is_control.patch

Revision history for this message
jenkins (martin-mrazik+qa) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Sam Spilsbury (smspillaz) wrote :

Right, although we've changed the packaging repo used for jenkins to lp:~compiz-team/compiz/ubuntu , although its still failing and the publisher is broken so we can't see why

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

OK, I have hacked away the offending reference to primary_is_control.patch in lp:~compiz-team/compiz/ubuntu

Try again.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'compizconfig/libcompizconfig/src/bindings.c'
--- compizconfig/libcompizconfig/src/bindings.c 2012-09-25 06:12:24 +0000
+++ compizconfig/libcompizconfig/src/bindings.c 2012-10-10 12:52:21 +0000
@@ -38,14 +38,7 @@
38#include <X11/Xlib.h>38#include <X11/Xlib.h>
3939
40#include <ccs.h>40#include <ccs.h>
4141#include <ccs-modifier-list-inl.h>
42#define CompAltMask (1 << 16)
43#define CompMetaMask (1 << 17)
44#define CompSuperMask (1 << 18)
45#define CompHyperMask (1 << 19)
46#define CompModeSwitchMask (1 << 20)
47#define CompNumLockMask (1 << 21)
48#define CompScrollLockMask (1 << 22)
4942
50#define SCREEN_EDGE_LEFT (1 << 0)43#define SCREEN_EDGE_LEFT (1 << 0)
51#define SCREEN_EDGE_RIGHT (1 << 1)44#define SCREEN_EDGE_RIGHT (1 << 1)
@@ -56,15 +49,10 @@
56#define SCREEN_EDGE_BOTTOMLEFT (1 << 6)49#define SCREEN_EDGE_BOTTOMLEFT (1 << 6)
57#define SCREEN_EDGE_BOTTOMRIGHT (1 << 7)50#define SCREEN_EDGE_BOTTOMRIGHT (1 << 7)
5851
59struct _Modifier52struct _Modifier modifierList[] = {
60{
61 char *name;
62 int modifier;
63}
64
65modifierList[] = {
66 { "<Shift>", ShiftMask },53 { "<Shift>", ShiftMask },
67 { "<Control>", ControlMask },54 { "<Control>", ControlMask },
55 { "<Primary>", ControlMask },
68 { "<Mod1>", Mod1Mask },56 { "<Mod1>", Mod1Mask },
69 { "<Mod2>", Mod2Mask },57 { "<Mod2>", Mod2Mask },
70 { "<Mod3>", Mod3Mask },58 { "<Mod3>", Mod3Mask },
@@ -77,8 +65,6 @@
77 { "<ModeSwitch>", CompModeSwitchMask },65 { "<ModeSwitch>", CompModeSwitchMask },
78};66};
7967
80#define N_MODIFIERS (sizeof (modifierList) / sizeof (struct _Modifier))
81
82struct _Edge {68struct _Edge {
83 char *name;69 char *name;
84 char *modName;70 char *modName;
@@ -98,9 +84,15 @@
9884
99#define N_EDGES (sizeof (edgeList) / sizeof (edgeList[0]))85#define N_EDGES (sizeof (edgeList) / sizeof (edgeList[0]))
10086
87unsigned int
88ccsInternalUtilNumModifiers ()
89{
90 return sizeof (modifierList) / sizeof (struct _Modifier);
91}
92
101static char *93static char *
102stringAppend (char *s,94stringAppend (char *s,
103 char *a)95 const char *a)
104{96{
105 char *r;97 char *r;
106 int len;98 int len;
@@ -133,16 +125,48 @@
133 return s;125 return s;
134}126}
135127
128void
129ccsAddKeybindingMaskToString (char **bindingString,
130 unsigned int matchBindingMask,
131 unsigned int *addedBindingMask,
132 unsigned int addBindingMask,
133 const char *addBindingString)
134{
135 if (addBindingMask & matchBindingMask &&
136 !(*addedBindingMask & addBindingMask))
137 {
138 *bindingString = stringAppend (*bindingString, addBindingString);
139 *addedBindingMask |= addBindingMask;
140 }
141}
142
143
144void
145ccsAddStringToKeybindingMask (unsigned int *bindingMask,
146 const char *bindingString,
147 unsigned int addBindingMask,
148 const char *addBindingString)
149{
150 if (strcasestr (bindingString, addBindingString))
151 {
152 *bindingMask |= addBindingMask;
153 }
154}
155
136char *156char *
137ccsModifiersToString (unsigned int modMask)157ccsModifiersToString (unsigned int modMask)
138{158{
139 char *binding = NULL;159 char *binding = NULL;
160 unsigned int addedBindings = 0;
140 int i;161 int i;
141162
142 for (i = 0; i < N_MODIFIERS; i++)163 for (i = 0; i < ccsInternalUtilNumModifiers (); i++)
143 {164 {
144 if (modMask & modifierList[i].modifier)165 ccsAddKeybindingMaskToString (&binding,
145 binding = stringAppend (binding, modifierList[i].name);166 modMask,
167 &addedBindings,
168 modifierList[i].modifier,
169 modifierList[i].name);
146 }170 }
147171
148 return binding;172 return binding;
@@ -235,10 +259,12 @@
235 unsigned int mods = 0;259 unsigned int mods = 0;
236 int i;260 int i;
237261
238 for (i = 0; i < N_MODIFIERS; i++)262 for (i = 0; i < ccsInternalUtilNumModifiers (); i++)
239 {263 {
240 if (strcasestr (binding, modifierList[i].name))264 ccsAddStringToKeybindingMask (&mods,
241 mods |= modifierList[i].modifier;265 binding,
266 modifierList[i].modifier,
267 modifierList[i].name);
242 }268 }
243269
244 return mods;270 return mods;
245271
=== added file 'compizconfig/libcompizconfig/src/ccs-modifier-list-inl.h'
--- compizconfig/libcompizconfig/src/ccs-modifier-list-inl.h 1970-01-01 00:00:00 +0000
+++ compizconfig/libcompizconfig/src/ccs-modifier-list-inl.h 2012-10-10 12:52:21 +0000
@@ -0,0 +1,50 @@
1/*
2 * Compiz configuration system library
3 *
4 * Copyright (C) 2007 Danny Baumann <maniac@opencompositing.org>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#ifndef _CCS_MODIFIER_LIST_INL_H
22#define _CCS_MODIFIER_LIST_INL_H
23
24#include <ccs-defs.h>
25
26COMPIZCONFIG_BEGIN_DECLS
27
28#include <X11/X.h>
29#include <X11/Xlib.h>
30
31#define CompAltMask (1 << 16)
32#define CompMetaMask (1 << 17)
33#define CompSuperMask (1 << 18)
34#define CompHyperMask (1 << 19)
35#define CompModeSwitchMask (1 << 20)
36#define CompNumLockMask (1 << 21)
37#define CompScrollLockMask (1 << 22)
38
39struct _Modifier
40{
41 char *name;
42 int modifier;
43};
44
45extern struct _Modifier modifierList[];
46unsigned int ccsInternalUtilNumModifiers ();
47
48COMPIZCONFIG_END_DECLS
49
50#endif
051
=== modified file 'compizconfig/libcompizconfig/src/ccs-private.h'
--- compizconfig/libcompizconfig/src/ccs-private.h 2012-09-10 01:06:55 +0000
+++ compizconfig/libcompizconfig/src/ccs-private.h 2012-10-10 12:52:21 +0000
@@ -22,6 +22,10 @@
22#ifndef CCS_PRIVATE_H22#ifndef CCS_PRIVATE_H
23#define CSS_PRIVATE_H23#define CSS_PRIVATE_H
2424
25#include <ccs-defs.h>
26
27COMPIZCONFIG_BEGIN_DECLS
28
25#include <ccs.h>29#include <ccs.h>
26#include <ccs-backend.h>30#include <ccs-backend.h>
2731
@@ -158,4 +162,19 @@
158unsigned int ccsAddConfigWatch (CCSContext *context,162unsigned int ccsAddConfigWatch (CCSContext *context,
159 FileWatchCallbackProc callback);163 FileWatchCallbackProc callback);
160164
165void
166ccsAddKeybindingMaskToString (char **bindingString,
167 unsigned int matchBindingMask,
168 unsigned int *addedBindingMask,
169 unsigned int addBindingMask,
170 const char *addBindingString);
171
172void
173ccsAddStringToKeybindingMask (unsigned int *bindingMask,
174 const char *bindingString,
175 unsigned int addBindingMask,
176 const char *addBindingString);
177
178COMPIZCONFIG_END_DECLS
179
161#endif180#endif
162181
=== modified file 'compizconfig/libcompizconfig/tests/CMakeLists.txt'
--- compizconfig/libcompizconfig/tests/CMakeLists.txt 2012-09-25 08:39:18 +0000
+++ compizconfig/libcompizconfig/tests/CMakeLists.txt 2012-10-10 12:52:21 +0000
@@ -32,6 +32,9 @@
32add_executable (compizconfig_test_ccs_mock_backend_conformance32add_executable (compizconfig_test_ccs_mock_backend_conformance
33 ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_mock_backend_conformance.cpp)33 ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_mock_backend_conformance.cpp)
3434
35add_executable (compizconfig_test_ccs_util
36 ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_util.cpp)
37
35add_executable (compizconfig_test_ccs_upgrade_internal38add_executable (compizconfig_test_ccs_upgrade_internal
36 ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_settings_upgrade_internal.cpp)39 ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_settings_upgrade_internal.cpp)
3740
@@ -136,6 +139,14 @@
136 compizconfig_ccs_setting_value_matcher139 compizconfig_ccs_setting_value_matcher
137)140)
138141
142target_link_libraries (compizconfig_test_ccs_util
143 ${GTEST_BOTH_LIBRARIES}
144 ${GMOCK_LIBRARY}
145 ${GMOCK_MAIN_LIBRARY}
146 ${CMAKE_THREAD_LIBS_INIT}
147 compizconfig
148)
149
139compiz_discover_tests (compizconfig_test_ccs_object COVERAGE compizconfig)150compiz_discover_tests (compizconfig_test_ccs_object COVERAGE compizconfig)
140compiz_discover_tests (compizconfig_test_ccs_context COVERAGE compizconfig_ccs_context_mock)151compiz_discover_tests (compizconfig_test_ccs_context COVERAGE compizconfig_ccs_context_mock)
141compiz_discover_tests (compizconfig_test_ccs_plugin COVERAGE compizconfig_ccs_plugin_mock)152compiz_discover_tests (compizconfig_test_ccs_plugin COVERAGE compizconfig_ccs_plugin_mock)
@@ -143,3 +154,4 @@
143compiz_discover_tests (compizconfig_test_ccs_mock_backend_conformance COVERAGE compizconfig_ccs_backend_mock)154compiz_discover_tests (compizconfig_test_ccs_mock_backend_conformance COVERAGE compizconfig_ccs_backend_mock)
144compiz_discover_tests (compizconfig_test_ccs_text_file COVERAGE ccs_text_file_interface compizconfig_ccs_text_file_mock)155compiz_discover_tests (compizconfig_test_ccs_text_file COVERAGE ccs_text_file_interface compizconfig_ccs_text_file_mock)
145compiz_discover_tests (compizconfig_test_ccs_upgrade_internal COVERAGE ccs_settings_upgrade_internal)156compiz_discover_tests (compizconfig_test_ccs_upgrade_internal COVERAGE ccs_settings_upgrade_internal)
157compiz_discover_tests (compizconfig_test_ccs_util COVERAGE compizconfig)
146158
=== added file 'compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp'
--- compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp 1970-01-01 00:00:00 +0000
+++ compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp 2012-10-10 12:52:21 +0000
@@ -0,0 +1,238 @@
1/*
2 * Compiz configuration system library
3 *
4 * Copyright (C) 2007 Dennis Kasprzyk <onestone@opencompositing.org>
5 * Copyright (C) 2007 Danny Baumann <maniac@opencompositing.org>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include <gtest/gtest.h>
23#include <gtest_shared_characterwrapper.h>
24
25#include <ccs.h>
26#include <ccs-private.h>
27#include <ccs-modifier-list-inl.h>
28
29using ::testing::WithParamInterface;
30
31namespace
32{
33 const std::string firstBindingString = "<First>";
34 const std::string secondBindingString = "<Second>";
35
36 const unsigned int firstBindingMask = (1 << 0);
37 const unsigned int secondBindingMask = (1 << 1);
38}
39
40TEST (CCSUtilTest, TestAddKeybindingMaskToStringInitial)
41{
42 char *bindingStringChar = NULL;
43 unsigned int addedBindingMask = 0;
44
45 ccsAddKeybindingMaskToString (&bindingStringChar,
46 firstBindingMask,
47 &addedBindingMask,
48 firstBindingMask,
49 firstBindingString.c_str ());
50
51 CharacterWrapper bindingString (bindingStringChar);
52
53 EXPECT_EQ (firstBindingString, bindingStringChar);
54 EXPECT_EQ (addedBindingMask, firstBindingMask);
55}
56
57TEST (CCSUtilTest, TestAddKeybindingMaskToStringNoDuplicates)
58{
59 char *bindingStringChar = NULL;
60 unsigned int addedBindingMask = 0;
61
62 ccsAddKeybindingMaskToString (&bindingStringChar,
63 firstBindingMask,
64 &addedBindingMask,
65 firstBindingMask,
66 firstBindingString.c_str ());
67
68 ccsAddKeybindingMaskToString (&bindingStringChar,
69 firstBindingMask,
70 &addedBindingMask,
71 firstBindingMask,
72 secondBindingString.c_str ());
73
74 CharacterWrapper bindingString (bindingStringChar);
75
76 EXPECT_EQ (firstBindingString, bindingStringChar);
77 EXPECT_EQ (addedBindingMask, firstBindingMask);
78}
79
80TEST (CCSUtilTest, TestAddStringToKeybindingMask)
81{
82 unsigned int bindingMask = 0;
83
84 ccsAddStringToKeybindingMask (&bindingMask,
85 firstBindingString.c_str (),
86 firstBindingMask,
87 firstBindingString.c_str ());
88
89 EXPECT_EQ (bindingMask, firstBindingMask);
90}
91
92namespace
93{
94 class ModifierParam
95 {
96 public:
97
98 ModifierParam (const char *modifierString,
99 unsigned int modifierMask,
100 bool match) :
101 mModifierString (modifierString),
102 mModifierMask (modifierMask),
103 mMatch (match)
104 {
105 }
106
107 ModifierParam (const ModifierParam &param) :
108 mModifierString (param.mModifierString),
109 mModifierMask (param.mModifierMask),
110 mMatch (param.mMatch)
111 {
112 }
113
114 friend void swap (ModifierParam &lhs, ModifierParam &rhs)
115 {
116 using std::swap;
117
118 swap (lhs.mMatch, rhs.mMatch);
119 swap (lhs.mModifierMask, rhs.mModifierMask);
120 swap (lhs.mModifierString, rhs.mModifierString);
121 }
122
123 ModifierParam &
124 operator= (const ModifierParam &other)
125 {
126 ModifierParam to (other);
127 swap (*this, to);
128 return *this;
129 }
130
131 std::string mModifierString;
132 unsigned int mModifierMask;
133 bool mMatch;
134 };
135
136 ::testing::internal::ParamGenerator<ModifierParam>
137 GenerateModifierParams ()
138 {
139 std::vector <ModifierParam> params;
140 params.reserve (ccsInternalUtilNumModifiers () *
141 ccsInternalUtilNumModifiers ());
142
143 for (unsigned int i = 0; i < ccsInternalUtilNumModifiers (); ++i)
144 {
145 if (modifierList[i].name == std::string ("<Primary>"))
146 continue;
147
148 for (unsigned int j = 0; j < ccsInternalUtilNumModifiers (); ++j)
149 {
150 const bool modifierMatch = modifierList[i].modifier ==
151 modifierList[j].modifier;
152
153 params.push_back (ModifierParam (modifierList[i].name,
154 modifierList[j].modifier,
155 modifierMatch));
156 }
157 }
158
159 return ::testing::ValuesIn (params);
160 }
161
162 bool
163 CheckModifierListSanity ()
164 {
165 return (modifierList[0].modifier !=
166 modifierList[1].modifier) &&
167 (std::string (modifierList[0].name) !=
168 std::string (modifierList[1].name));
169 }
170
171 const char *modifierSanityMsg = "This test requires the name and modifier " \
172 "value in modifierList[0] and " \
173 "modifierList[1] to be different " \
174 "to work correctly";
175}
176
177class CCSUtilModifiersTest :
178 public ::testing::Test,
179 public WithParamInterface <ModifierParam>
180{
181};
182
183TEST_P (CCSUtilModifiersTest, TestModifiersToString)
184{
185 CharacterWrapper modifierString (ccsModifiersToString (GetParam ().mModifierMask));
186 char *modifierStringChar = modifierString;
187 /* Force "<Primary>" to test as "<Control>" as "<Primary>"
188 * should never be reachable */
189 const std::string expectedModifierString (GetParam ().mModifierString !=
190 std::string ("<Primary>") ?
191 GetParam ().mModifierString :
192 "<Control>");
193
194 if (GetParam ().mMatch)
195 EXPECT_EQ (expectedModifierString, modifierStringChar);
196 else
197 EXPECT_NE (expectedModifierString, modifierStringChar);
198}
199
200TEST_P (CCSUtilModifiersTest, TestStringToModifiers)
201{
202 unsigned int modifierMask (ccsStringToModifiers (GetParam ().mModifierString.c_str ()));
203
204 if (GetParam ().mMatch)
205 EXPECT_EQ (GetParam ().mModifierMask, modifierMask);
206 else
207 EXPECT_NE (GetParam ().mModifierMask, modifierMask);
208}
209
210INSTANTIATE_TEST_CASE_P (CCSRealModifiers, CCSUtilModifiersTest,
211 GenerateModifierParams ());
212
213TEST (CCSUtilModifierTest, TestMultiModifierToString)
214{
215 ASSERT_TRUE (CheckModifierListSanity ()) << modifierSanityMsg;
216
217 const unsigned int modifierMask = modifierList[0].modifier |
218 modifierList[1].modifier;
219 const std::string expectedModifierString = std::string (modifierList[0].name) +
220 std::string (modifierList[1].name);
221 CharacterWrapper modifierString (ccsModifiersToString (modifierMask));
222 const char *modifierStringChar = modifierString;
223
224 EXPECT_EQ (expectedModifierString, modifierStringChar);
225}
226
227TEST (CCSUtilModifierTest, TestMultiStringToModifier)
228{
229 ASSERT_TRUE (CheckModifierListSanity ()) << modifierSanityMsg;
230
231 const unsigned int expectedModifierMask = modifierList[0].modifier |
232 modifierList[1].modifier;
233 const std::string modifierString = std::string (modifierList[0].name) +
234 std::string (modifierList[1].name);
235 unsigned int modifierMask = (ccsStringToModifiers (modifierString.c_str ()));
236
237 EXPECT_EQ (expectedModifierMask, modifierMask);
238}

Subscribers

People subscribed via source and target branches