Files
cellar/test/functions_lookup_test.dart
T

94 lines
3.0 KiB
Dart

import 'package:cellar/cellar.dart';
import 'package:test/test.dart';
double num(CellValue value) => (value as NumberValue).value;
Sheet lookupSheet() {
final sheet = Sheet();
final rows = [
['apple', '1', 'red'],
['banana', '2', 'yellow'],
['cherry', '3', 'red'],
];
for (var r = 0; r < rows.length; r++) {
sheet.setValue('A${r + 1}', rows[r][0]);
sheet.setValue('B${r + 1}', rows[r][1]);
sheet.setValue('C${r + 1}', rows[r][2]);
}
return sheet;
}
void main() {
group('lookup functions', () {
test('VLOOKUP exact match returns another column', () {
final sheet = lookupSheet();
sheet.setValue('E1', '=VLOOKUP("banana", A1:C3, 3, FALSE)');
expect(sheet.valueOf('E1'), const TextValue('yellow'));
});
test('VLOOKUP approximate on sorted numbers', () {
final sheet = Sheet();
sheet.setValue('A1', '0');
sheet.setValue('B1', 'low');
sheet.setValue('A2', '10');
sheet.setValue('B2', 'mid');
sheet.setValue('A3', '20');
sheet.setValue('B3', 'high');
sheet.setValue('D1', '=VLOOKUP(15, A1:B3, 2)');
expect(sheet.valueOf('D1'), const TextValue('mid'));
});
test('VLOOKUP missing exact key is #N/A', () {
final sheet = lookupSheet();
sheet.setValue('E1', '=VLOOKUP("mango", A1:C3, 2, FALSE)');
expect(sheet.valueOf('E1'), const ErrorValue(ErrorKind.na));
});
test('HLOOKUP across a row', () {
final sheet = Sheet();
sheet.setValue('A1', 'Q1');
sheet.setValue('B1', 'Q2');
sheet.setValue('C1', 'Q3');
sheet.setValue('A2', '10');
sheet.setValue('B2', '20');
sheet.setValue('C2', '30');
sheet.setValue('E1', '=HLOOKUP("Q2", A1:C2, 2, FALSE)');
expect(num(sheet.valueOf('E1')), 20);
});
test('MATCH exact and approximate', () {
final sheet = lookupSheet();
sheet.setValue('E1', '=MATCH("cherry", A1:A3, 0)');
expect(num(sheet.valueOf('E1')), 3);
final numbers = Sheet();
numbers.setValue('A1', '10');
numbers.setValue('A2', '20');
numbers.setValue('A3', '30');
numbers.setValue('B1', '=MATCH(25, A1:A3, 1)');
expect(num(numbers.valueOf('B1')), 2);
});
test('INDEX and INDEX/MATCH', () {
final sheet = lookupSheet();
sheet.setValue('E1', '=INDEX(A1:C3, 2, 3)');
sheet.setValue('E2', '=INDEX(B1:B3, MATCH("cherry", A1:A3, 0))');
expect(sheet.valueOf('E1'), const TextValue('yellow'));
expect(num(sheet.valueOf('E2')), 3);
});
test('CHOOSE ROWS COLUMNS ROW COLUMN', () {
final sheet = lookupSheet();
sheet.setValue('E1', '=CHOOSE(2, "a", "b", "c")');
sheet.setValue('E2', '=ROWS(A1:C3)');
sheet.setValue('E3', '=COLUMNS(A1:C3)');
sheet.setValue('E4', '=ROW(B5)');
sheet.setValue('E5', '=COLUMN(D2)');
expect(sheet.valueOf('E1'), const TextValue('b'));
expect(num(sheet.valueOf('E2')), 3);
expect(num(sheet.valueOf('E3')), 3);
expect(num(sheet.valueOf('E4')), 5);
expect(num(sheet.valueOf('E5')), 4);
});
});
}