public boolean run() {
		PrintStream original = System.out;
		PrintStream noPrint = new PrintStream(new OutputStream() {
												public void write(int b) {}
											});


		try {
			Method m[] = this.getClass().getDeclaredMethods(); // Get all methods
			for( Method i : m ) {
				if( i.getName().startsWith("test") ) { // If it starts with the prefix test
					currentTest = true;

					Boolean thrown = false; // If the test threw an exception
					try {
						if( suppress_prints ) {
							System.setOut(noPrint);
						}

						i.invoke(this);

						System.setOut(original);
					} catch( Throwable t ) {
						System.setOut(original);
						thrown = true;
						System.out.print("E");
						String new_message = "\t" + i.getName() + " threw an exception\n";
						new_message += "\t\t" + t.toString() + "\n";

						Throwable cause = t.getCause();
						while( cause != null ) {
							new_message += "\t\t\t" + cause.toString() + "\n";
							cause = cause.getCause();
						}

						addMessage(new_message);
						this.failCount++;
					}

					if( !this.currentTest ) { // If the current test failed
						System.out.print("F");
						this.failCount++;
					} else if(!thrown) {
						System.out.print(".");
					}
					this.finalizeMessages(i.getName());
				}
			}
			System.out.println("");
			if( this.failCount > 0 ) {
				printMessages();
				System.out.println("");
				System.out.println("[FAILED COUNT=" + this.failCount + "]");
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return true;
	}