blob: cb5c12c99324e8a5a8d1c48d102f2e1169b50650 [file] [log] [blame]
// Copyright 2018 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.
import 'dart:async';
import 'package:test/test.dart';
import 'package:repl/interact.dart';
void main() {
const delete = '\u{7f}';
const up = '\u{1b}[A';
const down = '\u{1b}[B';
const forward = '\u{1b}[C';
const back = '\u{1b}[D';
test('write and delete', () {
expect(interact(Stream.fromIterable([
'1', '2', '3',
delete, delete, delete, delete,
])), emitsInOrder([
[Output.prompt, '1', 1],
[Output.prompt, '12', 2],
[Output.prompt, '123', 3],
[Output.prompt, '12', 2],
[Output.prompt, '1', 1],
[Output.prompt, '', 0],
[Output.bell],
]));
});
test('delete from middle and check boundaries', () {
expect(interact(Stream.fromIterable([
'1', '2', '3',
back, delete,
back, back,
forward, forward, forward,
back,
])), emitsInOrder([
[Output.prompt, '1', 1],
[Output.prompt, '12', 2],
[Output.prompt, '123', 3],
[Output.prompt, '123', 2],
[Output.prompt, '13', 1],
[Output.prompt, '13', 0],
[Output.bell],
[Output.prompt, '13', 1],
[Output.prompt, '13', 2],
[Output.bell],
[Output.prompt, '13', 1],
]));
});
test('history', () {
expect(interact(Stream.fromIterable([
'1', '\n', '2', '\n',
up, up, up,
down, down,
back, '-', '\n',
up, up,
])), emitsInOrder([
[Output.prompt, '1', 1],
[Output.evaluate, '1'],
[Output.prompt, '2', 1],
[Output.evaluate, '2'],
[Output.prompt, '2', 1],
[Output.prompt, '1', 1],
[Output.bell],
[Output.prompt, '2', 1],
[Output.bell],
[Output.prompt, '2', 0],
[Output.prompt, '-2', 1],
[Output.evaluate, '-2'],
[Output.prompt, '-2', 2],
[Output.prompt, '2', 1],
]));
});
test('unicode literal', () {
expect(interact(Stream.fromIterable([
'1', back, '🐙',
])), emitsInOrder([
[Output.prompt, '1', 1],
[Output.prompt, '1', 0],
[Output.prompt, '\\u{1f419}1', 9],
]));
});
test('paste', () {
expect(interact(Stream.fromIterable([
'123',
])), emitsInOrder([
[Output.prompt, '123', 3],
]));
});
test('multi-line paste', () {
expect(interact(Stream.fromIterable([
'1', '2\n34\n5',
up, up,
])), emitsInOrder([
[Output.prompt, '1', 1],
[Output.evaluate, '12'],
[Output.evaluate, '34'],
[Output.prompt, '5', 1],
[Output.prompt, '34', 2],
[Output.prompt, '12', 2],
]));
});
}