/// ---- 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

final configuration = 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,
      #toString: (o) => o.toString,
    },
    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: {},
      smoke_0.F: {
        #staticMethod: const Declaration(#staticMethod, Function, kind: METHOD, isStatic: true),
      },
      smoke_0.F2: {},
      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]),
      },
      smoke_0.K: {
        #k: const Declaration(#k, int, annotations: const [const smoke_0.AnnotC(named: true)]),
        #k2: const Declaration(#k2, int, annotations: const [const smoke_0.AnnotC()]),
      },
      _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(() => useGeneratedCode(configuration));
  common.main();
}
