blob: ebb20b5b882bd8b5d713c6a48f51d471e4c8243c [file] [log] [blame]
// Copyright (C) 2022 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import {EngineBase} from '../../trace_processor/engine';
import {Column} from './column';
import {SqlTableState} from './state';
import {SqlTableDescription} from './table_description';
const table: SqlTableDescription = {
name: 'table',
displayName: 'Table',
columns: [
{
name: 'id',
},
{
name: 'name',
title: 'Name',
},
{
name: 'ts',
display: {
type: 'timestamp',
},
startsHidden: true,
},
{
name: 'arg_set_id',
type: 'arg_set_id',
title: 'Arg',
},
],
};
class FakeEngine extends EngineBase {
id: string = 'TestEngine';
rpcSendRequestBytes(_data: Uint8Array) {}
}
test('sqlTableState: columnManupulation', () => {
const engine = new FakeEngine();
const state = new SqlTableState(engine, table);
const idColumn = {
alias: 'id',
expression: 'id',
title: 'id',
};
const nameColumn = {
alias: 'name',
expression: 'name',
title: 'Name',
};
const tsColumn: Column = {
alias: 'ts',
expression: 'ts',
title: 'ts',
display: {
type: 'timestamp',
},
};
// The initial set of columns should include "id" and "name",
// but not "ts" (as it is marked as startsHidden) and not "arg_set_id"
// (as it is a special column).
expect(state.getSelectedColumns()).toEqual([idColumn, nameColumn]);
state.addColumn(tsColumn, 0);
expect(state.getSelectedColumns()).toEqual([idColumn, tsColumn, nameColumn]);
state.hideColumnAtIndex(0);
expect(state.getSelectedColumns()).toEqual([tsColumn, nameColumn]);
});
test('sqlTableState: sortedColumns', () => {
const engine = new FakeEngine();
const state = new SqlTableState(engine, table);
// Verify that we have two columns: "id" and "name" and
// save references to them.
expect(state.getSelectedColumns().length).toBe(2);
const idColumn = state.getSelectedColumns()[0];
expect(idColumn.alias).toBe('id');
const nameColumn = state.getSelectedColumns()[1];
expect(nameColumn.alias).toBe('name');
// Sort by name column and verify that it is sorted by.
state.sortBy({
column: nameColumn,
direction: 'ASC',
});
expect(state.isSortedBy(idColumn)).toBe(undefined);
expect(state.isSortedBy(nameColumn)).toBe('ASC');
// Sort by the same column in the opposite direction.
state.sortBy({
column: nameColumn,
direction: 'DESC',
});
expect(state.isSortedBy(idColumn)).toBe(undefined);
expect(state.isSortedBy(nameColumn)).toBe('DESC');
// Sort by the id column.
state.sortBy({
column: idColumn,
direction: 'ASC',
});
expect(state.isSortedBy(idColumn)).toBe('ASC');
expect(state.isSortedBy(nameColumn)).toBe(undefined);
// When the column is hidden, it should no longer be sorted by
// and we should fall back to the previously sorted by column.
state.hideColumnAtIndex(0);
expect(state.isSortedBy(nameColumn)).toBe('DESC');
// Remove the sorting and verify that we are no sorted by.
state.unsort();
expect(state.isSortedBy(nameColumn)).toBe(undefined);
});
// Clean up repeated whitespaces to allow for easier testing.
function normalize(s: string): string {
return s.replace(/\s+/g, ' ').trim();
}
test('sqlTableState: sqlStatement', () => {
const engine = new FakeEngine();
const state = new SqlTableState(engine, table);
// Check the generated SQL statement.
expect(normalize(state.buildSqlSelectStatement().selectStatement)).toBe(
'SELECT id as id, name as name FROM table',
);
});