// Copyright 2020 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:io';

import 'package:test/test.dart';

import '../render/ast.dart';
import '../report.pb.dart' as bloaty_report;
import '../testing_util.dart';
import '../types.dart';
import 'crates.dart';

void main() {
  Directory testData = locateTestData();
  test('libasync-default.so has no crates', () async {
    final report = Report.fromBytes(
        'libasync',
        await File('${testData.path}/libasync-default.so.bloaty_report_pb')
            .readAsBytes());
    final query = CratesQuery()..addReport(report);
    expect(query.toString(), equals('Nothing selected'));
    expect(query.distill().export(), equals([Node.plain('Nothing selected')]));
  });

  test('single crate', () {
    final protobufReport = bloaty_report.Report()
      ..compileUnits.add(bloaty_report.CompileUnit()
        ..symbols.add(bloaty_report.Symbol.create()
          ..sizes = (bloaty_report.SizeInfo.create()..fileActual = 42)
          ..maybeRustCrate = 'foo'));
    final report = Report.fromBloaty('test', protobufReport);
    final query = CratesQuery()..addReport(report);
    expect(query.toString(), equals('foo: 42 B (42), count: 1'));
  });
}
