blob: 34c86cb1eb22eab684b899cb490d0c63765110b6 [file] [log] [blame]
// Copyright (c) 2021, 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:expect/expect.dart";
import "private_name_library.dart";
// These tests are adapted from the set located in
// language/nonfunction_type_aliases/private_names/ to highlight a specific
// DDC issue with public fields in private classes.
void main() {
test1();
test2();
}
/// Extend a private class via a public typedef without overriding any methods.
class Derived extends PublicClass {
Derived() : super();
}
/// Extend a private class via a public typedef overriding methods and
/// properties. The final field `x` is overridden with a getter which returns
/// different values every time it is called.
class AlsoDerived extends AlsoPublicClass {
int backingStore = publicNameSentinel;
int get x => ++backingStore;
int get y => super.x;
AlsoDerived() : super.named(privateNameSentinel);
}
/// Test that inherited properties work correctly
void test1() {
var p = Derived();
// Reading the virtual field should give the private value
Expect.equals(privateNameSentinel, p.x);
// Reading the virtual field from the private library should give the private
// value
Expect.equals(privateNameSentinel, readInstanceField(p));
}
/// Test that overridden properties work correctly.
void test2() {
var p = AlsoDerived();
// Reading the original virtual field should give the private value.
Expect.equals(privateNameSentinel, p.y);
// Reading the overriding getter from the private library should give the
// public value and increment it each time it is called.
Expect.equals(publicNameSentinel, p.backingStore);
Expect.equals(publicNameSentinel + 1, readInstanceField2(p));
Expect.equals(publicNameSentinel + 1, p.backingStore);
// Reading the overriding getter from the original library should give the
// public value and increment it each time it is called.
Expect.equals(publicNameSentinel + 2, p.x);
Expect.equals(publicNameSentinel + 2, p.backingStore);
Expect.equals(privateNameSentinel, p.y);
Expect.equals(publicNameSentinel + 2, p.backingStore);
Expect.equals(publicNameSentinel + 3, readInstanceField2(p));
Expect.equals(publicNameSentinel + 4, p.x);
}