blob: d0151b933e5163deada31871e1742a3873104c77 [file] [log] [blame]
import 'package:devtools_app/src/ui/search.dart';
import 'package:flutter/material.dart';
import 'package:test/test.dart';
void main() {
group('AutoComplete', () {
setUp(() {
// TODO: add code to run before each test
});
// [caretPosition] if null (default) TextSelection is set to EOL.
EditingParts testEdit(String editing, [int caretPosition]) {
final position = caretPosition == null ? editing.length : caretPosition;
return AutoCompleteSearchControllerMixin.activeEdtingParts(
editing,
TextSelection(baseOffset: position, extentOffset: position),
handleFields: true,
);
}
// Set debug to true displays editing parts.
const debug = false;
void outputResult(int num, EditingParts editingParts) {
if (debug) {
print('$num. left=${editingParts.leftSide}, '
'active=${editingParts.activeWord}');
}
}
test('activeEditing parsing caret EOL', () {
// Test for various types of auto-complete (tracking) used for expression evaluator
// with caret (insertion point) at EOL.
EditingParts parts = testEdit('baseO');
outputResult(0, parts);
expect(parts.activeWord, 'baseO');
expect(parts.leftSide.isEmpty, isTrue);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject');
outputResult(1, parts);
expect(parts.activeWord, 'baseObject');
expect(parts.leftSide.isEmpty, isTrue);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.');
outputResult(2, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(parts.leftSide, 'baseObject.');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
parts = testEdit('baseObject.cl');
outputResult(3, parts);
expect(parts.activeWord, 'cl');
expect(parts.leftSide, 'baseObject.');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
parts = testEdit('baseObject.close+');
outputResult(4, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(parts.leftSide, 'baseObject.close+');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.close+1000+');
outputResult(5, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(parts.leftSide, 'baseObject.close+1000+');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.close+1000+char');
outputResult(6, parts);
expect(parts.activeWord, 'char');
expect(parts.leftSide, 'baseObject.close+1000+');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.close + 1000');
outputResult(7, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(parts.leftSide, 'baseObject.close + 1000');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.close + 1000/2000 + cha');
outputResult(8, parts);
expect(parts.activeWord, 'cha');
expect(parts.leftSide, 'baseObject.close + 1000/2000 + ');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.close + 1000/2000 + chart');
outputResult(9, parts);
expect(parts.activeWord, 'chart');
expect(parts.leftSide, 'baseObject.close + 1000/2000 + ');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.close + 1000 / 2000 + chart.');
outputResult(10, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(parts.leftSide, 'baseObject.close + 1000 / 2000 + chart.');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
parts = testEdit('baseObject.close + 1000/2000 + chart.tr');
outputResult(11, parts);
expect(parts.activeWord, 'tr');
expect(parts.leftSide, 'baseObject.close + 1000/2000 + chart.');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
parts = testEdit('baseObject.close+1000/2000+chart.traces');
outputResult(12, parts);
expect(parts.activeWord, 'traces');
expect(parts.leftSide, 'baseObject.close+1000/2000+chart.');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
parts = testEdit('baseObject.close + 1000/2000 + chart.traces[10');
outputResult(13, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(parts.leftSide, 'baseObject.close + 1000/2000 + chart.traces[10');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.close + 1000/2000 + chart.traces[10]');
outputResult(14, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(parts.leftSide, 'baseObject.close + 1000/2000 + chart.traces[10]');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit('baseObject.close + 1000/2000 + chart.traces[10].yNa');
outputResult(15, parts);
expect(parts.activeWord, 'yNa');
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
parts = testEdit('baseObject.close + 1000/2000 + chart.traces[addO');
outputResult(16, parts);
expect(parts.activeWord, 'addO');
expect(parts.leftSide, 'baseObject.close + 1000/2000 + chart.traces[');
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts =
testEdit('baseObject.close + 1000/2000 + chart.traces[addOne,addT');
outputResult(17, parts);
expect(parts.activeWord, 'addT');
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[addOne,',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[addOne,addTwo]');
outputResult(18, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[addOne,addTwo]',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[addOne,addTwo].xNam');
outputResult(19, parts);
expect(parts.activeWord, 'xNam');
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[addOne,addTwo].',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute');
outputResult(20, parts);
expect(parts.activeWord, 'compute');
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].yName + ',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute()');
outputResult(21, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute()',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute(foo',
);
outputResult(22, parts);
expect(parts.activeWord, 'foo');
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute(',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute(foo,bar');
outputResult(23, parts);
expect(parts.activeWord, 'bar');
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute(foo,',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute(foo,bar)');
outputResult(24, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute(foo,bar)',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute() + foo');
outputResult(25, parts);
expect(parts.activeWord, 'foo');
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute() + ',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isFalse);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute() + foobar.');
outputResult(26, parts);
expect(parts.activeWord.isEmpty, isTrue);
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute() + foobar.',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
parts = testEdit(
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute() + foobar.length');
outputResult(27, parts);
expect(parts.activeWord, 'length');
expect(
parts.leftSide,
'baseObject.close + 1000/2000 + chart.traces[10].yName + compute() + foobar.',
);
expect(parts.rightSide.isEmpty, isTrue);
expect(parts.isField, isTrue);
});
test('activeEditing parsing caret inside', () {
EditingParts parts;
// Test for various types of auto-complete (tracking) used for expression evaluator
// with caret (insertion point) within the text (not at EOL).
// Expression 1 test.
const expression1 = 'myApplication.name + ch + controller.clear()';
int caret1 = expression1.indexOf('ch + ');
expect(caret1 >= 0, isTrue);
caret1 += 2; // Caret after ch
parts = testEdit(expression1, caret1);
outputResult(1, parts);
expect(parts.activeWord, 'ch');
expect(parts.leftSide, 'myApplication.name + ');
expect(parts.rightSide, ' + controller.clear()');
expect(parts.isField, isFalse);
// Expression 2 test.
const expression2 = 'myApplication.name + chart.tra + controller.clear()';
int caret2 = expression2.indexOf('tra + ');
expect(caret2 >= 0, isTrue);
caret2 += 3; // Caret after tra
parts = testEdit(expression2, caret2);
outputResult(2, parts);
expect(parts.activeWord, 'tra');
expect(parts.leftSide, 'myApplication.name + chart.');
expect(parts.rightSide, ' + controller.clear()');
expect(parts.isField, isTrue);
});
});
}