// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_TESTING_DART_FIXTURE_H_
#define FLUTTER_TESTING_DART_FIXTURE_H_

#include <memory>

#include "flutter/common/settings.h"
#include "flutter/runtime/dart_vm.h"
#include "flutter/testing/elf_loader.h"
#include "flutter/testing/test_dart_native_resolver.h"
#include "flutter/testing/testing.h"
#include "flutter/testing/thread_test.h"

namespace flutter::testing {

class DartFixture {
 public:
  // Uses the default filenames from the fixtures generator.
  DartFixture();

  // Allows to customize the kernel, ELF and split ELF filenames.
  DartFixture(std::string kernel_filename,
              std::string elf_filename,
              std::string elf_split_filename);

  virtual Settings CreateSettingsForFixture();

  void AddNativeCallback(std::string name, Dart_NativeFunction callback);
  void AddFfiNativeCallback(std::string name, void* callback_ptr);

 protected:
  void SetSnapshotsAndAssets(Settings& settings);

  std::shared_ptr<TestDartNativeResolver> native_resolver_;
  ELFAOTSymbols split_aot_symbols_;
  std::string kernel_filename_;
  std::string elf_filename_;
  fml::UniqueFD assets_dir_;
  ELFAOTSymbols aot_symbols_;

 private:
  FML_DISALLOW_COPY_AND_ASSIGN(DartFixture);
};

}  // namespace flutter::testing

#endif  // FLUTTER_TESTING_DART_FIXTURE_H_
