[escher/test] Layout selection in layout_field

This commit is contained in:
Léa Saviot
2019-12-23 14:44:56 +01:00
parent a92326f9c9
commit 61f26e3e4c
3 changed files with 219 additions and 1 deletions

View File

@@ -86,6 +86,9 @@ escher_src += $(addprefix escher/src/,\
window.cpp \
)
tests_src += $(addprefix escher/test/,\
layout_field.cpp\
)
$(eval $(call rule_for, \
HOSTCC, \

View File

@@ -379,7 +379,7 @@ bool LayoutField::privateHandleEvent(Ion::Events::Event event) {
}
return true;
}
if (isEditing() && m_delegate->layoutFieldShouldFinishEditing(this, event)) { //TODO use class method?
if (isEditing() && m_delegate && m_delegate->layoutFieldShouldFinishEditing(this, event)) { //TODO use class method?
setEditing(false);
if (m_delegate->layoutFieldDidFinishEditing(this, layout(), event)) {
// Reinit layout for next use

View File

@@ -0,0 +1,215 @@
#include <quiz.h>
#include <escher.h>
#include <assert.h>
void assert_events_lead_to_selection(const Ion::Events::Event * events, int numberOfEvents, const char * selectedParsedAndSerializedText) {
LayoutField field = LayoutField(nullptr, nullptr);
field.setEditing(true);
for (int i = 0; i < numberOfEvents; i++) {
field.handleEvent(events[i]);
}
Clipboard::sharedClipboard()->reset();
field.handleEvent(Ion::Events::Copy);
quiz_assert(strcmp(Clipboard::sharedClipboard()->storedText(), selectedParsedAndSerializedText) == 0);
}
QUIZ_CASE(escher_layout_field_select_left_right) {
// 123
{
// Select in a simple horizontal layout towards the left
const int eventsCount = 6;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::ShiftLeft, Ion::Events::ShiftLeft, Ion::Events::ShiftLeft};
assert_events_lead_to_selection(events, eventsCount - 2, "3");
assert_events_lead_to_selection(events, eventsCount - 1, "23");
assert_events_lead_to_selection(events, eventsCount, "123");
}
{
// Select in a simple horizontal layout towards the right
const int eventsCount = 9;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Left, Ion::Events::Left, Ion::Events::Left,
Ion::Events::ShiftRight, Ion::Events::ShiftRight, Ion::Events::ShiftRight};
assert_events_lead_to_selection(events, eventsCount - 2, "1");
assert_events_lead_to_selection(events, eventsCount - 1, "12");
assert_events_lead_to_selection(events, eventsCount, "123");
}
{
// Select in a simple horizontal layout left then right
const int eventsCount = 7;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Left, Ion::Events::ShiftLeft, Ion::Events::ShiftLeft,
Ion::Events::ShiftRight};
assert_events_lead_to_selection(events, eventsCount, "2");
}
{
/* Select in a simple horizontal layout towards the right and hit the end of
* layout. */
const int eventsCount = 11;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Left, Ion::Events::Left, Ion::Events::Left,
Ion::Events::ShiftRight, Ion::Events::ShiftRight, Ion::Events::ShiftRight,
Ion::Events::ShiftRight, Ion::Events::ShiftRight};
assert_events_lead_to_selection(events, eventsCount, "123");
}
{
/* Select in a simple horizontal layout towards the right, hit the end of
* layout and select left. */
const int eventsCount = 11;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Left, Ion::Events::Left, Ion::Events::Left,
Ion::Events::ShiftRight, Ion::Events::ShiftRight, Ion::Events::ShiftRight,
Ion::Events::ShiftRight, Ion::Events::ShiftLeft};
assert_events_lead_to_selection(events, eventsCount, "12");
}
/* g34
* 1+---+78
* h56 */
{
/* Select in a horizontal layout with a fraction, starting outside the
* fraction. */
const int eventsCount = 17;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Plus, Ion::Events::LowerG,
Ion::Events::Three, Ion::Events::Four, Ion::Events::Division,
Ion::Events::LowerH, Ion::Events::Five, Ion::Events::Six,
Ion::Events::Right, Ion::Events::Plus, Ion::Events::Seven,
Ion::Events::Eight, Ion::Events::ShiftLeft, Ion::Events::ShiftLeft,
Ion::Events::ShiftLeft, Ion::Events::ShiftLeft};
assert_events_lead_to_selection(events, eventsCount, "\x12\x12g34\x13/\x12h56\x13\x13+78");
}
{
/* Select in a horizontal layout with a fraction, starting inside the
* fraction. */
const int eventsCount = 21;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Plus, Ion::Events::LowerG,
Ion::Events::Three, Ion::Events::Four, Ion::Events::Division,
Ion::Events::LowerH, Ion::Events::Five, Ion::Events::Six,
Ion::Events::Right, Ion::Events::Plus, Ion::Events::Seven,
Ion::Events::Eight, Ion::Events::Left, Ion::Events::Left,
Ion::Events::Left, Ion::Events::Left, Ion::Events::Left,
Ion::Events::ShiftLeft, Ion::Events::ShiftLeft, Ion::Events::ShiftLeft,
};
assert_events_lead_to_selection(events, eventsCount, "g34/h56");
}
}
QUIZ_CASE(escher_layout_field_select_up_down) {
// 12
{
// Select in a simple horizontal layout up
const int eventsCount = 5;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::ShiftLeft,
Ion::Events::ShiftUp};
assert_events_lead_to_selection(events, eventsCount, "2");
}
{
// Select in a simple horizontal layout up
const int eventsCount = 5;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::ShiftLeft,
Ion::Events::ShiftDown};
assert_events_lead_to_selection(events, eventsCount, "2");
}
/* 123
* ---
* 456 */
{
// Select up in a fraction
const int eventsCount = 11;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Division, Ion::Events::Four, Ion::Events::Five,
Ion::Events::Six, Ion::Events::Left, Ion::Events::ShiftLeft,
Ion::Events::ShiftUp, Ion::Events::ShiftRight};
assert_events_lead_to_selection(events, eventsCount - 1, "123/456");
assert_events_lead_to_selection(events, eventsCount, "");
}
{
// Select down in a fraction
const int eventsCount = 12;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Division, Ion::Events::Four, Ion::Events::Five,
Ion::Events::Six, Ion::Events::Left, Ion::Events::Up,
Ion::Events::ShiftLeft, Ion::Events::ShiftDown, Ion::Events::ShiftLeft};
assert_events_lead_to_selection(events, eventsCount - 1, "123/456");
assert_events_lead_to_selection(events, eventsCount, "");
}
/* 123
* 89+---
* 456 */
{
// Select up next to a fraction (cursor on fraction)
const int eventsCount = 15;
Ion::Events::Event events[eventsCount] = {
Ion::Events::Eight, Ion::Events::Nine, Ion::Events::Plus,
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Division, Ion::Events::Four, Ion::Events::Five,
Ion::Events::Six, Ion::Events::Left, Ion::Events::Left,
Ion::Events::Left, Ion::Events::Left, Ion::Events::ShiftUp};
assert_events_lead_to_selection(events, eventsCount, "123/456");
}
{
// Select down next to a fraction (cursor not on the fraction)
const int eventsCount = 17;
Ion::Events::Event events[eventsCount] = {
Ion::Events::Eight, Ion::Events::Nine, Ion::Events::Plus,
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Division, Ion::Events::Four, Ion::Events::Five,
Ion::Events::Six, Ion::Events::Left, Ion::Events::Left,
Ion::Events::Left, Ion::Events::Left, Ion::Events::Left,
Ion::Events::Right, Ion::Events::ShiftDown};
assert_events_lead_to_selection(events, eventsCount, "123/456");
}
}
QUIZ_CASE(escher_layout_field_unselect) {
// 1234
{
// Move left after selecting
const int eventsCount = 8;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Four, Ion::Events::ShiftLeft, Ion::Events::Left,
Ion::Events::Left, Ion::Events::ShiftRight};
assert_events_lead_to_selection(events, eventsCount, "3");
}
}
QUIZ_CASE(escher_layout_field_delete) {
// 1234
{
// Delete the selection
const int eventsCount = 17;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Four, Ion::Events::Left, Ion::Events::ShiftLeft,
Ion::Events::ShiftLeft, Ion::Events::Backspace, Ion::Events::Left,
Ion::Events::ShiftRight, Ion::Events::ShiftRight
};
assert_events_lead_to_selection(events, eventsCount, "14");
}
{
// Delete the by adding text
const int eventsCount = 19;
Ion::Events::Event events[eventsCount] = {
Ion::Events::One, Ion::Events::Two, Ion::Events::Three,
Ion::Events::Four, Ion::Events::Left, Ion::Events::ShiftLeft,
Ion::Events::ShiftLeft, Ion::Events::Zero, Ion::Events::Left,
Ion::Events::Left, Ion::Events::ShiftRight, Ion::Events::ShiftRight,
Ion::Events::ShiftRight
};
assert_events_lead_to_selection(events, eventsCount, "104");
}
}