/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------
/// To update this test file, call:
/// > dart codegen/end_to_end_test.dart --update_static_test
/// --------------------------------------------------------

library smoke.test.static_test;

import 'package:unittest/unittest.dart';
import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
import 'package:smoke/static.dart' show useGeneratedCode, StaticConfiguration;
import 'common.dart' as smoke_0;
import 'common.dart' as common show main;

abstract class _M0 {} // C & A

_configure() {
  useGeneratedCode(new StaticConfiguration(
      checkedMode: false,
      getters: {
        #i: (o) => o.i,
        #inc0: (o) => o.inc0,
        #inc1: (o) => o.inc1,
        #inc2: (o) => o.inc2,
        #j: (o) => o.j,
        #j2: (o) => o.j2,
      },
      setters: {
        #i: (o, v) { o.i = v; },
        #j2: (o, v) { o.j2 = v; },
      },
      parents: {
        smoke_0.AnnotB: smoke_0.Annot,
        smoke_0.D: _M0,
        smoke_0.E2: smoke_0.E,
        smoke_0.F2: smoke_0.F,
        smoke_0.H: smoke_0.G,
        _M0: smoke_0.C,
      },
      declarations: {
        smoke_0.A: {
          #i: const Declaration(#i, int),
          #inc0: const Declaration(#inc0, Function, kind: METHOD),
          #inc1: const Declaration(#inc1, Function, kind: METHOD),
          #inc2: const Declaration(#inc2, Function, kind: METHOD),
          #j: const Declaration(#j, int),
          #j2: const Declaration(#j2, int, kind: PROPERTY),
        },
        smoke_0.B: {
          #a: const Declaration(#a, smoke_0.A),
          #f: const Declaration(#f, int, isFinal: true),
          #w: const Declaration(#w, int, kind: PROPERTY),
        },
        smoke_0.C: {
          #b: const Declaration(#b, smoke_0.B),
          #inc: const Declaration(#inc, Function, kind: METHOD),
          #x: const Declaration(#x, int),
          #y: const Declaration(#y, String),
        },
        smoke_0.D: {
          #i2: const Declaration(#i2, int, kind: PROPERTY, isFinal: true),
          #x2: const Declaration(#x2, int, kind: PROPERTY, isFinal: true),
        },
        smoke_0.E: {
          #noSuchMethod: const Declaration(#noSuchMethod, Function, kind: METHOD),
          #y: const Declaration(#y, int, kind: PROPERTY, isFinal: true),
        },
        smoke_0.E2: const {},
        smoke_0.F: {
          #staticMethod: const Declaration(#staticMethod, Function, kind: METHOD, isStatic: true),
        },
        smoke_0.F2: const {},
        smoke_0.G: {
          #b: const Declaration(#b, int, annotations: const [smoke_0.a1]),
          #d: const Declaration(#d, int, annotations: const [smoke_0.a2]),
        },
        smoke_0.H: {
          #f: const Declaration(#f, int, annotations: const [smoke_0.a1]),
          #g: const Declaration(#g, int, annotations: const [smoke_0.a1]),
          #h: const Declaration(#h, int, annotations: const [smoke_0.a2]),
          #i: const Declaration(#i, int, annotations: const [smoke_0.a3]),
        },
        _M0: {
          #i: const Declaration(#i, int),
          #inc: const Declaration(#inc, Function, kind: METHOD),
          #inc0: const Declaration(#inc0, Function, kind: METHOD),
          #j: const Declaration(#j, int),
          #j2: const Declaration(#j2, int, kind: PROPERTY),
        },
      },
      staticMethods: {
        smoke_0.A: {
          #staticInc: smoke_0.A.staticInc,
        },
      },
      names: {
        #i: r'i',
      }));
}

main() {
  setUp(_configure);
  common.main();
}
