// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:ffigen/ffigen.dart';
import 'package:ffigen/src/code_generator.dart';
import 'package:ffigen/src/strings.dart' as strings;
import 'package:test/test.dart';

import '../test_utils.dart';

void main() {
  group('exclude_all_by_default', () {
    test('exclude_all_by_default test flag false', () {
      final config = testConfig('''
${strings.name}: 'NativeLibrary'
${strings.description}: 'exclude_all_by_default test'
${strings.output}: 'unused'
${strings.excludeAllByDefault}: false
${strings.headers}:
  ${strings.entryPoints}:
    - 'test/config_tests/exclude_all_by_default.h'
''');

      final library = parse(config);
      expect(library.getBinding('func'), isA<Func>());
      expect(library.getBinding('Struct'), isA<Struct>());
      expect(library.getBinding('Union'), isA<Union>());
      expect(library.getBinding('global'), isA<Global>());
      expect(library.getBinding('MACRO'), isA<Constant>());
      expect(library.getBinding('Enum'), isA<EnumClass>());
      expect(library.getBinding('unnamedEnum'), isA<Constant>());
    });

    test('exclude_all_by_default test flag true', () {
      final config = testConfig('''
${strings.name}: 'NativeLibrary'
${strings.description}: 'exclude_all_by_default test'
${strings.output}: 'unused'
${strings.excludeAllByDefault}: true
${strings.headers}:
  ${strings.entryPoints}:
    - 'test/config_tests/exclude_all_by_default.h'
''');

      final library = parse(config);
      expect(() => library.getBinding('func'), throwsException);
      expect(() => library.getBinding('Struct'), throwsException);
      expect(() => library.getBinding('Union'), throwsException);
      expect(() => library.getBinding('global'), throwsException);
      expect(() => library.getBinding('MACRO'), throwsException);
      expect(() => library.getBinding('Enum'), throwsException);
      expect(() => library.getBinding('unnamedEnum'), throwsException);
    });
  });
}
