blob: 79a383228e19cdc3b8699dfa349d43e1b3d55891 [file] [log] [blame]
// Copyright (c) 2024, 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/src/config_provider/config_types.dart';
import 'package:ffigen/src/header_parser/sub_parsers/api_availability.dart';
import 'package:test/test.dart';
void main() {
test('PlatformAvailability.deprecatedOrObsoleted', () {
expect(PlatformAvailability().deprecatedOrObsoleted, null);
expect(
PlatformAvailability(deprecated: Version(1, 2, 3)).deprecatedOrObsoleted,
Version(1, 2, 3),
);
expect(
PlatformAvailability(obsoleted: Version(1, 2, 3)).deprecatedOrObsoleted,
Version(1, 2, 3),
);
expect(
PlatformAvailability(
deprecated: Version(1, 2, 3),
obsoleted: Version(4, 5, 6),
).deprecatedOrObsoleted,
Version(1, 2, 3),
);
expect(
PlatformAvailability(
deprecated: Version(4, 5, 6),
obsoleted: Version(1, 2, 3),
).deprecatedOrObsoleted,
Version(1, 2, 3),
);
});
test('PlatformAvailability.getAvailability', () {
expect(
PlatformAvailability(unavailable: true).getAvailability(const Versions()),
Availability.none,
);
Availability getAvailability(
Version? apiMin,
Version? apiMax,
Version? confMin,
Version? confMax,
) => PlatformAvailability(
introduced: apiMin,
deprecated: apiMax,
).getAvailability(Versions(min: confMin, max: confMax));
final v1 = Version(1, 0, 0);
final v2 = Version(2, 0, 0);
final v3 = Version(3, 0, 0);
final v4 = Version(4, 0, 0);
final v5 = Version(5, 0, 0);
final v6 = Version(6, 0, 0);
final v7 = Version(7, 0, 0);
final v8 = Version(8, 0, 0);
expect(getAvailability(null, null, null, null), Availability.all);
expect(getAvailability(null, null, null, v2), Availability.all);
expect(getAvailability(null, null, v1, null), Availability.all);
expect(getAvailability(null, null, v1, v2), Availability.all);
expect(getAvailability(v3, null, null, null), Availability.some);
expect(getAvailability(v3, null, null, v2), Availability.none);
expect(getAvailability(v3, null, null, v3), Availability.some);
expect(getAvailability(v3, null, null, v5), Availability.some);
expect(getAvailability(v3, null, v1, null), Availability.some);
expect(getAvailability(v3, null, v1, v2), Availability.none);
expect(getAvailability(v3, null, v1, v3), Availability.some);
expect(getAvailability(v3, null, v1, v5), Availability.some);
expect(getAvailability(v3, null, v3, null), Availability.all);
expect(getAvailability(v3, null, v3, v5), Availability.all);
expect(getAvailability(v3, null, v4, null), Availability.all);
expect(getAvailability(v3, null, v4, v5), Availability.all);
expect(getAvailability(null, v3, null, null), Availability.some);
expect(getAvailability(null, v3, null, v2), Availability.all);
expect(getAvailability(null, v3, null, v3), Availability.some);
expect(getAvailability(null, v3, null, v5), Availability.some);
expect(getAvailability(null, v3, v1, null), Availability.some);
expect(getAvailability(null, v3, v1, v2), Availability.all);
expect(getAvailability(null, v3, v1, v3), Availability.some);
expect(getAvailability(null, v3, v1, v5), Availability.some);
expect(getAvailability(null, v3, v3, null), Availability.none);
expect(getAvailability(null, v3, v3, v5), Availability.none);
expect(getAvailability(null, v3, v4, null), Availability.none);
expect(getAvailability(null, v3, v4, v5), Availability.none);
expect(getAvailability(v3, v6, null, null), Availability.some);
expect(getAvailability(v3, v6, null, v2), Availability.none);
expect(getAvailability(v3, v6, null, v3), Availability.some);
expect(getAvailability(v3, v6, null, v5), Availability.some);
expect(getAvailability(v3, v6, null, v6), Availability.some);
expect(getAvailability(v3, v6, null, v8), Availability.some);
expect(getAvailability(v3, v6, v1, null), Availability.some);
expect(getAvailability(v3, v6, v1, v2), Availability.none);
expect(getAvailability(v3, v6, v1, v3), Availability.some);
expect(getAvailability(v3, v6, v1, v5), Availability.some);
expect(getAvailability(v3, v6, v1, v6), Availability.some);
expect(getAvailability(v3, v6, v1, v8), Availability.some);
expect(getAvailability(v3, v6, v3, null), Availability.some);
expect(getAvailability(v3, v6, v3, v5), Availability.all);
expect(getAvailability(v3, v6, v3, v6), Availability.some);
expect(getAvailability(v3, v6, v3, v8), Availability.some);
expect(getAvailability(v3, v6, v5, null), Availability.some);
expect(getAvailability(v3, v6, v5, v6), Availability.some);
expect(getAvailability(v3, v6, v5, v8), Availability.some);
expect(getAvailability(v3, v6, v6, null), Availability.none);
expect(getAvailability(v3, v6, v6, v8), Availability.none);
expect(getAvailability(v3, v6, v7, null), Availability.none);
expect(getAvailability(v3, v6, v7, v8), Availability.none);
});
group('Availability.getAvailability', () {
test('empty', () {
expect(
ApiAvailability(
externalVersions: const ExternalVersions(),
).availability,
Availability.all,
);
expect(
ApiAvailability(
externalVersions: ExternalVersions(
ios: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.all,
);
expect(
ApiAvailability(
externalVersions: ExternalVersions(
macos: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.all,
);
expect(
ApiAvailability(
externalVersions: ExternalVersions(
ios: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
macos: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.all,
);
});
test('always deprecated', () {
expect(
ApiAvailability(
alwaysDeprecated: true,
externalVersions: const ExternalVersions(),
).availability,
Availability.all,
);
expect(
ApiAvailability(
alwaysDeprecated: true,
externalVersions: ExternalVersions(
ios: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.none,
);
expect(
ApiAvailability(
alwaysDeprecated: true,
externalVersions: ExternalVersions(
macos: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.none,
);
expect(
ApiAvailability(
alwaysDeprecated: true,
externalVersions: ExternalVersions(
ios: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
macos: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.none,
);
});
test('always unavailable', () {
expect(
ApiAvailability(
alwaysUnavailable: true,
externalVersions: const ExternalVersions(),
).availability,
Availability.all,
);
expect(
ApiAvailability(
alwaysUnavailable: true,
externalVersions: ExternalVersions(
ios: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.none,
);
expect(
ApiAvailability(
alwaysUnavailable: true,
externalVersions: ExternalVersions(
macos: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.none,
);
expect(
ApiAvailability(
alwaysUnavailable: true,
externalVersions: ExternalVersions(
ios: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
macos: Versions(min: Version(1, 2, 3), max: Version(4, 5, 6)),
),
).availability,
Availability.none,
);
});
test('versions', () {
final v1 = Version(1, 0, 0);
final v2 = Version(2, 0, 0);
final v3 = Version(3, 0, 0);
final v4 = Version(4, 0, 0);
final v5 = Version(5, 0, 0);
final v6 = Version(6, 0, 0);
final plat = PlatformAvailability(introduced: v1, deprecated: v4);
final verInside = Versions(min: v2, max: v3);
final verOverlap = Versions(min: v2, max: v6);
final verOutside = Versions(min: v5, max: v6);
final verEmpty = const Versions();
Availability getAvail(
PlatformAvailability? iosAvail,
PlatformAvailability? macosAvail,
Versions? iosVer,
Versions? macosVer,
) => ApiAvailability(
ios: iosAvail,
macos: macosAvail,
externalVersions: ExternalVersions(ios: iosVer, macos: macosVer),
).availability;
expect(getAvail(null, null, null, null), Availability.all);
expect(getAvail(null, null, verEmpty, verEmpty), Availability.all);
expect(getAvail(plat, plat, null, null), Availability.all);
expect(getAvail(plat, plat, verEmpty, verEmpty), Availability.all);
expect(getAvail(plat, plat, null, verInside), Availability.all);
expect(getAvail(plat, plat, null, verOverlap), Availability.some);
expect(getAvail(plat, plat, null, verOutside), Availability.none);
expect(getAvail(plat, plat, verInside, null), Availability.all);
expect(getAvail(plat, plat, verOverlap, null), Availability.some);
expect(getAvail(plat, plat, verOutside, null), Availability.none);
expect(getAvail(plat, plat, verEmpty, verInside), Availability.all);
expect(getAvail(plat, plat, verEmpty, verOverlap), Availability.some);
expect(getAvail(plat, plat, verEmpty, verOutside), Availability.none);
expect(getAvail(plat, plat, verInside, verEmpty), Availability.all);
expect(getAvail(plat, plat, verOverlap, verEmpty), Availability.some);
expect(getAvail(plat, plat, verOutside, verEmpty), Availability.none);
expect(getAvail(plat, plat, verInside, verInside), Availability.all);
expect(getAvail(plat, plat, verInside, verOverlap), Availability.some);
expect(getAvail(plat, plat, verInside, verOutside), Availability.some);
expect(getAvail(plat, plat, verOverlap, verInside), Availability.some);
expect(getAvail(plat, plat, verOverlap, verOverlap), Availability.some);
expect(getAvail(plat, plat, verOverlap, verOutside), Availability.some);
expect(getAvail(plat, plat, verOutside, verInside), Availability.some);
expect(getAvail(plat, plat, verOutside, verOverlap), Availability.some);
expect(getAvail(plat, plat, verOutside, verOutside), Availability.none);
expect(getAvail(null, plat, verInside, verInside), Availability.all);
expect(getAvail(null, plat, verInside, verOverlap), Availability.some);
expect(getAvail(null, plat, verInside, verOutside), Availability.some);
expect(getAvail(null, plat, verOverlap, verInside), Availability.all);
expect(getAvail(null, plat, verOverlap, verOverlap), Availability.some);
expect(getAvail(null, plat, verOverlap, verOutside), Availability.some);
expect(getAvail(null, plat, verOutside, verInside), Availability.all);
expect(getAvail(null, plat, verOutside, verOverlap), Availability.some);
expect(getAvail(null, plat, verOutside, verOutside), Availability.some);
expect(getAvail(plat, null, verInside, verInside), Availability.all);
expect(getAvail(plat, null, verInside, verOverlap), Availability.all);
expect(getAvail(plat, null, verInside, verOutside), Availability.all);
expect(getAvail(plat, null, verOverlap, verInside), Availability.some);
expect(getAvail(plat, null, verOverlap, verOverlap), Availability.some);
expect(getAvail(plat, null, verOverlap, verOutside), Availability.some);
expect(getAvail(plat, null, verOutside, verInside), Availability.some);
expect(getAvail(plat, null, verOutside, verOverlap), Availability.some);
expect(getAvail(plat, null, verOutside, verOutside), Availability.some);
});
});
test('ApiAvailability.dartDoc', () {
expect(
ApiAvailability(
ios: PlatformAvailability(
name: 'iOS',
introduced: Version(1, 2, 3),
deprecated: Version(4, 5, 6),
obsoleted: Version(7, 8, 9),
),
macos: PlatformAvailability(
name: 'macOS',
deprecated: Version(10, 11, 12),
),
externalVersions: const ExternalVersions(),
).dartDoc,
isNull,
);
expect(
ApiAvailability(
ios: PlatformAvailability(
name: 'iOS',
introduced: Version(1, 2, 3),
deprecated: Version(4, 5, 6),
obsoleted: Version(7, 8, 9),
),
macos: PlatformAvailability(
name: 'macOS',
deprecated: Version(10, 11, 12),
),
externalVersions: ExternalVersions(
ios: Versions(max: Version(1, 0, 0)),
),
).dartDoc,
isNull,
);
expect(
ApiAvailability(
ios: PlatformAvailability(
name: 'iOS',
introduced: Version(1, 2, 3),
deprecated: Version(4, 5, 6),
obsoleted: Version(7, 8, 9),
),
macos: PlatformAvailability(
name: 'macOS',
deprecated: Version(10, 11, 12),
),
externalVersions: ExternalVersions(
ios: Versions(min: Version(1, 2, 3), max: Version(1, 3, 5)),
macos: Versions(max: Version(4, 5, 6)),
),
).dartDoc,
isNull,
);
expect(
ApiAvailability(
ios: PlatformAvailability(
name: 'iOS',
introduced: Version(1, 2, 3),
deprecated: Version(4, 5, 6),
obsoleted: Version(7, 8, 9),
),
macos: PlatformAvailability(
name: 'macOS',
deprecated: Version(10, 11, 12),
),
externalVersions: ExternalVersions(
ios: Versions(min: Version(1, 2, 3), max: Version(1, 3, 5)),
macos: Versions(max: Version(11, 12, 13)),
),
).dartDoc,
'''
iOS: introduced 1.2.3, deprecated 4.5.6, obsoleted 7.8.9
macOS: deprecated 10.11.12''',
);
expect(
ApiAvailability(
ios: PlatformAvailability(
name: 'iOS',
introduced: Version(1, 2, 3),
obsoleted: Version(4, 5, 6),
),
externalVersions: ExternalVersions(
ios: Versions(max: Version(2, 3, 4)),
),
).dartDoc,
'iOS: introduced 1.2.3, obsoleted 4.5.6',
);
expect(
ApiAvailability(
ios: PlatformAvailability(name: 'macOS', unavailable: true),
externalVersions: ExternalVersions(
ios: Versions(max: Version(1, 2, 3)),
macos: Versions(max: Version(2, 3, 4)),
),
).dartDoc,
'macOS: unavailable',
);
expect(
ApiAvailability(
externalVersions: const ExternalVersions(ios: Versions()),
).dartDoc,
isNull,
);
});
}