/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v0.5
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v05.html

Contributors:
    IBM Corporation - Initial implementation
**********************************************************************/

public class EvalNestedTypeTests {
	
	int a= 1;
	String aa= "one";
	
	static int b= 2;
	static String bb= "two";
	
	int c= 3;
	String cc= "three";
	
	static int d= 4;
	static String dd= "four";
	
	int e= 5;
	String ee= "five";
	
	static int f= 6;
	static String ff= "six";

	static class A {
		int g= 7;
		String gg= "seven";
		
		static int h= 8;
		static String hh= "eight";
		
		int c= 37;
		String cc= "three seven";
		
		static int d= 48;
		static String dd= "four eight";
		
		static class AA {
			int i= 9;
			String ii= "nine";
			
			static int j= 0;
			static String jj= "zero";
			
			int c= 379;
			String cc= "three seven nine";
			
			static int d= 480;
			static String dd= "four eight zero";
			
			int e= 59;
			String ee= "five nine";
			
			static int f= 60;
			static String ff= "six zero";
			
			void aa() {
				System.out.println("Tests ...");
			}
				
			static void aaStatic() {
				System.out.println("Tests ...");
			}
				
		}
		
		class AB {
			int i= 9;
			String ii= "nine";
			
			final static int j= 0;
			final static String jj= "zero";
			
			int c= 379;
			String cc= "three seven nine";
			
			final static int d= 480;
			final static String dd= "four eight zero";
			
			int e= 59;
			String ee= "five nine";
			
			final static int f= 60;
			final static String ff= "six zero";
			
			void ab() {
				System.out.println("Tests ...");
			}

		}
		
		void a() {
			class AC {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				void ac() {
					System.out.println("Tests ...");
					g = g;
				}
			}
			
			Runnable i_ad= new Runnable() {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				public void run() {
					System.out.println("Tests ...");
					g = g;
				}
			};
			AB i_ab= new AB();
			i_ab.ab();
			AC i_ac= new AC();
			i_ac.ac();
			i_ad.run();
			
			System.out.println("Tests ...");
		}
		
		static void aStatic() {
			class AE {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				void ae() {
					System.out.println("Tests ...");
				}
			}
			
			Runnable i_af= new Runnable() {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				public void run() {
					System.out.println("Tests ...");
				}
			};
			
			AA i_aa= new AA();
			i_aa.aa();
			AA.aaStatic();
			AE i_ae= new AE();
			i_ae.ae();
			i_af.run();
			
			System.out.println("Tests ...");
		}
			
	}

	class B {
		int g= 7;
		String gg= "seven";
		
		final static int h= 8;
		final static String hh= "eight";
		
		int c= 37;
		String cc= "three seven";
		
		final static int d= 48;
		final static String dd= "four eight";
		
		class BB {
			int i= 9;
			String ii= "nine";
			
			final static int j= 0;
			final static String jj= "zero";
			
			int c= 379;
			String cc= "three seven nine";
			
			final static int d= 480;
			final static String dd= "four eight zero";
			
			int e= 59;
			String ee= "five nine";
			
			final static int f= 60;
			final static String ff= "six zero";
			
			void bb() {
				System.out.println("Tests ...");
				g = g;
			}
			
		}
		
		void b() {
			class BC {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				void bc() {
					System.out.println("Tests ...");
					g = g;
				}
			}
			
			Runnable i_bd= new Runnable() {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				public void run() {
					System.out.println("Tests ...");
					g = g;
				}
			};
			
			BB i_bb= new BB();
			i_bb.bb();
			BC i_bc= new BC();
			i_bc.bc();
			i_bd.run();

			System.out.println("Tests ...");
			a = a;
		}
	}
	
	void evalNestedTypeTest() {
		class C {
			int g= 7;
			String gg= "seven";
			
			final static int h= 8;
			final static String hh= "eight";
			
			int c= 37;
			String cc= "three seven";
			
			final static int d= 48;
			final static String dd= "four eight";
			
			class CB {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				void cb() {
					System.out.println("Tests ...");
					a = a;
				}
	
			}
			
			void c() {
				class CC {
					int i= 9;
					String ii= "nine";
					
					final static int j= 0;
					final static String jj= "zero";
					
					int c= 379;
					String cc= "three seven nine";
					
					final static int d= 480;
					final static String dd= "four eight zero";
					
					int e= 59;
					String ee= "five nine";
					
					final static int f= 60;
					final static String ff= "six zero";
					
					void cc() {
						System.out.println("Tests ...");
						a = a;
					}
				}
				
				Runnable i_cd= new Runnable() {
					int i= 9;
					String ii= "nine";
					
					final static int j= 0;
					final static String jj= "zero";
					
					int c= 379;
					String cc= "three seven nine";
					
					final static int d= 480;
					final static String dd= "four eight zero";
					
					int e= 59;
					String ee= "five nine";
					
					final static int f= 60;
					final static String ff= "six zero";
					
					public void run() {
						System.out.println("Tests ...");
						a = a;
					}
				};
				
				CB i_cb= new CB();
				i_cb.cb();
				CC i_cc= new CC();
				i_cc.cc();
				i_cd.run();

				System.out.println("Tests ...");
			}
							
		}
	
		Runnable i_d= new Runnable() {
			int g= 7;
			String gg= "seven";
			
			final static int h= 8;
			final static String hh= "eight";
			
			int c= 37;
			String cc= "three seven";
			
			final static int d= 48;
			final static String dd= "four eight";
			
			class DB {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				void db() {
					System.out.println("Tests ...");
					a = a;
				}
			}
			
			public void run() {
				class DC {
					int i= 9;
					String ii= "nine";
					
					final static int j= 0;
					final static String jj= "zero";
					
					int c= 379;
					String cc= "three seven nine";
					
					final static int d= 480;
					final static String dd= "four eight zero";
					
					int e= 59;
					String ee= "five nine";
					
					final static int f= 60;
					final static String ff= "six zero";
					
					void dc() {
						System.out.println("Tests ...");
						a = a;
					}
				}
				
				Runnable i_dd= new Runnable() {
					int i= 9;
					String ii= "nine";
					
					final static int j= 0;
					final static String jj= "zero";
					
					int c= 379;
					String cc= "three seven nine";
					
					final static int d= 480;
					final static String dd= "four eight zero";
					
					int e= 59;
					String ee= "five nine";
					
					final static int f= 60;
					final static String ff= "six zero";
					
					public void run() {
						System.out.println("Tests ...");
						a = a;
					}
				};
				
				DB i_db= new DB();
				i_db.db();
				DC i_dc= new DC();
				i_dc.dc();
				i_dd.run();

				System.out.println("Tests ...");
			}
		};
		
		B i_b= new B();
		B.BB i_bb= i_b.new BB();
		i_b.b();
		C i_c= new C();
		C.CB i_cb= i_c.new CB();
		i_c.c();
		i_d.run();
		
		System.out.println("Tests ...");
	}

	static void evalNestedTypeTestStatic() {
		class E {
			int g= 7;
			String gg= "seven";
			
			final static int h= 8;
			final static String hh= "eight";
			
			int c= 37;
			String cc= "three seven";
			
			final static int d= 48;
			final static String dd= "four eight";
			
			class EB {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				void eb() {
					System.out.println("Tests ...");
				}
	
			}
			
			void e() {
				class EC {
					int i= 9;
					String ii= "nine";
					
					final static int j= 0;
					final static String jj= "zero";
					
					int c= 379;
					String cc= "three seven nine";
					
					final static int d= 480;
					final static String dd= "four eight zero";
					
					int e= 59;
					String ee= "five nine";
					
					final static int f= 60;
					final static String ff= "six zero";
					
					void ec() {
						System.out.println("Tests ...");
					}
				}
				
				Runnable i_ed= new Runnable() {
					int i= 9;
					String ii= "nine";
					
					final static int j= 0;
					final static String jj= "zero";
					
					int c= 379;
					String cc= "three seven nine";
					
					final static int d= 480;
					final static String dd= "four eight zero";
					
					int e= 59;
					String ee= "five nine";
					
					final static int f= 60;
					final static String ff= "six zero";
					
					public void run() {
						System.out.println("Tests ...");
					}
				};
				
				EB i_eb= new EB();
				i_eb.eb();
				EC i_ec= new EC();
				i_ec.ec();
				i_ed.run();

				System.out.println("Tests ...");
			}
							
		}
	
		Runnable i_f= new Runnable() {
			int g= 7;
			String gg= "seven";
			
			final static int h= 8;
			final static String hh= "eight";
			
			int c= 37;
			String cc= "three seven";
			
			final static int d= 48;
			final static String dd= "four eight";
			
			class FB {
				int i= 9;
				String ii= "nine";
				
				final static int j= 0;
				final static String jj= "zero";
				
				int c= 379;
				String cc= "three seven nine";
				
				final static int d= 480;
				final static String dd= "four eight zero";
				
				int e= 59;
				String ee= "five nine";
				
				final static int f= 60;
				final static String ff= "six zero";
				
				void fb() {
					System.out.println("Tests ...");
				}
	
			}
			
			public void run() {
				class FC {
					int i= 9;
					String ii= "nine";
					
					final static int j= 0;
					final static String jj= "zero";
					
					int c= 379;
					String cc= "three seven nine";
					
					final static int d= 480;
					final static String dd= "four eight zero";
					
					int e= 59;
					String ee= "five nine";
					
					final static int f= 60;
					final static String ff= "six zero";
					
					void fc() {
						System.out.println("Tests ...");
					}
				}
				
				Runnable i_fd= new Runnable() {
					int i= 9;
					String ii= "nine";
					
					final static int j= 0;
					final static String jj= "zero";
					
					int c= 379;
					String cc= "three seven nine";
					
					final static int d= 480;
					final static String dd= "four eight zero";
					
					int e= 59;
					String ee= "five nine";
					
					final static int f= 60;
					final static String ff= "six zero";
					
					public void run() {
						System.out.println("Tests ...");
					}
				};
				
				FB i_fb= new FB();
				i_fb.fb();
				FC i_fc= new FC();
				i_fc.fc();
				i_fd.run();

				System.out.println("Tests ...");
			}
		};
		
		A i_a= new A();
		i_a.a();
		A.aStatic();
		A.AA i_aa= new A.AA();
		A.AB i_ab= i_a.new AB();
		
		E i_e= new E();
		E.EB i_eb= i_e.new EB();
		i_e.e();
		i_f.run();
		
		System.out.println("Tests ...");
	}

	public static void main(String[] args) {
		new EvalNestedTypeTests().evalNestedTypeTest();
		EvalNestedTypeTests.evalNestedTypeTestStatic();
		System.out.println("Tests ...");
	}
}
