// Copyright (c) 2013, 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.

// @dart = 2.9

// Regression test for https://code.google.com/p/dart/issues/detail?id=10581.

import 'package:expect/expect.dart';

abstract class AxesObject {
  Update();
}

String result = '';

class Point2DObject extends AxesObject {
  Update() {
    result += 'P';
  }
}

class BestFitObject extends AxesObject {
  Update() {
    result += 'B';
  }
}

class Foo {
  AddAxesObject(type) {
    AxesObject a = null;
    switch (type) {
      case 100:
        a = new Point2DObject();
        break;
      case 200:
        a = new BestFitObject();
        break;
    }
    if (a != null) {
      a.Update();
    }
  }

  AddAxesObject2(type) {
    AxesObject a = null;
    if (type == 100) {
      a = new Point2DObject();
    } else if (type == 200) {
      a = new BestFitObject();
    }
    if (a != null) {
      a.Update();
    }
  }
}

main() {
  var f = new Foo();
  f.AddAxesObject(100);
  f.AddAxesObject(200);
  f.AddAxesObject2(100);
  f.AddAxesObject2(200);
  Expect.equals('PBPB', result);
}
