blob: 4cd3260acb8a6bc809a8483e5e48d1a4d85744ba [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use crate::test_helpers::TextFieldWrapper;
use failure::{bail, Error};
use fidl_fuchsia_ui_text as txt;
// TextField::OnUpdate() tests
// #######################################################
pub async fn test_noop_causes_state_update(text_field: &mut TextFieldWrapper) -> Result<(), Error> {
let rev = text_field.state().revision;
text_field.proxy().begin_edit(rev)?;
if await!(text_field.proxy().commit_edit())? != txt::TextError::Ok {
bail!("Expected commit_edit to succeed");
}
await!(text_field.wait_for_update())?;
// check that we get another state update, and revision was increased
if text_field.state().revision <= rev {
bail!(format!(
"Expected new revision ({}) to be greater than old revision ({})",
text_field.state().revision,
rev
));
}
Ok(())
}
// TextField::PointOffset()/TextField::Distance()/TextField::Contents() tests
// #######################################################
pub async fn test_simple_content_request(text_field: &mut TextFieldWrapper) -> Result<(), Error> {
await!(text_field.simple_insert("meow1 meow2 meow3"))?;
// check length and contents of last two meows
let mut doc_end = text_field.state().document.end;
let start_point = await!(text_field.point_offset(&mut doc_end, -11))?;
let range = txt::TextRange { start: start_point, end: doc_end };
await!(text_field.validate_distance(&range, 11))?;
Ok(())
}
pub async fn test_multibyte_unicode_content_request(
text_field: &mut TextFieldWrapper,
) -> Result<(), Error> {
await!(text_field.simple_insert("meow1 🐱 meow3"))?;
// check length and contents of last two meows
let mut doc_end = text_field.state().document.end;
let start_point = await!(text_field.point_offset(&mut doc_end, -7))?;
let range = txt::TextRange { start: start_point, end: doc_end };
await!(text_field.validate_distance(&range, 7))?;
await!(text_field.validate_contents(&range, "🐱 meow3"))?;
Ok(())
}
// TextField::CommitEdit() tests
// #######################################################
pub async fn test_multiple_edit_moves_points(
text_field: &mut TextFieldWrapper,
) -> Result<(), Error> {
await!(text_field.simple_insert("meow1 meow2 meow3 meow4"))?;
text_field.proxy().begin_edit(text_field.state().revision)?;
// replace "meow1" => "5" and "meow3" => "6" in a single transaction
{
let mut doc_start = text_field.state().document.start;
let end_point = await!(text_field.point_offset(&mut doc_start, 5))?;
let mut range = txt::TextRange { start: doc_start, end: end_point };
text_field.proxy().replace(&mut range, "5")?;
}
{
let mut doc_start = text_field.state().document.start;
let start_point = await!(text_field.point_offset(&mut doc_start, 12))?;
let end_point = await!(text_field.point_offset(&mut doc_start, 17))?;
let mut range = txt::TextRange { start: start_point, end: end_point };
text_field.proxy().replace(&mut range, "6")?;
}
await!(text_field.proxy().commit_edit())?;
await!(text_field.wait_for_update())?;
let doc = &mut text_field.state().document;
await!(text_field.validate_contents(doc, "5 meow2 6 meow4"))?;
await!(text_field.validate_distance(doc, 15))?;
Ok(())
}