Преглед изворни кода

Rudimentary unit test script.

Justin Hileman пре 15 година
родитељ
комит
6e508d5b48
1 измењених фајлова са 110 додато и 0 уклоњено
  1. 110 0
      test/MustacheTest.php

+ 110 - 0
test/MustacheTest.php

@@ -0,0 +1,110 @@
+<?php
+
+require_once '../Mustache.php';
+require_once 'PHPUnit/Framework.php';
+
+/**
+ * A PHPUnit test case for Mustache.php.
+ *
+ * This is a very basic, very rudimentary unit test case. It's probably more important to have tests
+ * than to have elegant tests, so let's bear with it for a bit.
+ *
+ * This class assumes an example directory exists at `../examples` with the following structure:
+ *
+ * @code
+ *    examples
+ *        foo
+ *            Foo.php
+ *            foo.mustache
+ *            foo.txt
+ *        bar
+ *            Bar.php
+ *            bar.mustache
+ *            bar.txt
+ * @endcode
+ *
+ * To use this test:
+ *
+ *  1. {@link http://www.phpunit.de/manual/current/en/installation.html Install PHPUnit}
+ *  2. run phpunit from the `test` directory:
+ *        `phpunit MustacheTest` or just `phpunit`
+ *  3. Fix bugs. Lather, rinse, repeat.
+ *
+ * @extends PHPUnit_Framework_TestCase
+ */
+class MustacheTest extends PHPUnit_Framework_TestCase {
+
+	/**
+	 * Test everything in the `examples` directory.
+	 *
+	 * @dataProvider getExamples
+	 * @access public
+	 * @param mixed $class
+	 * @param mixed $template
+	 * @param mixed $output
+	 * @return void
+	 */
+	public function testExamples($class, $template, $output) {
+		$m = new $class;
+		$this->assertEquals($m->render($template), $output);
+	}
+
+
+	/**
+	 * Data provider for testExamples method.
+	 *
+	 * Assumes that an `examples` directory exists inside parent directory.
+	 * This examples directory should contain any number of subdirectories, each of which contains
+	 * three files: one Mustache class (.php), one Mustache template (.mustache), and one output file
+	 * (.txt).
+	 *
+	 * This whole mess will be refined later to be more intuitive and less prescriptive, but it'll
+	 * do for now. Especially since it means we can have unit tests :)
+	 *
+	 * @access public
+	 * @return array
+	 */
+	public function getExamples() {
+		$basedir = dirname(__FILE__) . '/../examples/';
+
+		$ret = array();
+
+		$files = new RecursiveDirectoryIterator($basedir);
+		while ($files->valid()) {
+
+			if ($files->hasChildren() && $children = $files->getChildren()) {
+				$example  = $files->getSubPathname();
+				$class    = null;
+				$template = null;
+				$output   = null;
+
+				foreach ($children as $file) {
+					if (!$file->isFile()) continue;
+
+					$filename = $file->getPathInfo();
+					$info = pathinfo($filename);
+
+					switch($info['extension']) {
+						case 'php':
+							$class = $info['filename'];
+							include_once($filename);
+							break;
+
+						case 'mustache':
+							$template = file_get_contents($filename);
+							break;
+
+						case 'txt':
+							$output = file_get_contents($filename);
+							break;
+					}
+				}
+
+				$ret[$example] = array($class, $template, $output);
+			}
+
+			$files->next();
+		}
+		return $ret;
+	}
+}