<?php

class SiteTreeLinkTrackingTest extends SapphireTest {

	function isBroken($content) {
		$parser = new SiteTreeLinkTracking_Parser();
		$htmlValue = Injector::inst()->create('HTMLValue', $content);
		$links = $parser->process($htmlValue);

		if (empty($links[0])) return false;
		return $links[0]['Broken'];
	}

	function testParser() {
		$this->assertTrue($this->isBroken('<a href="[sitetree_link,id=123]">link</a>'));
		$this->assertTrue($this->isBroken('<a href="[sitetree_link,id=123]#no-such-anchor">link</a>'));
		$this->assertTrue($this->isBroken('<a href="[file_link,id=123]">link</a>'));
		$this->assertTrue($this->isBroken('<a href="">link</a>'));
		$this->assertTrue($this->isBroken('<a href="/">link</a>'));

		$this->assertFalse($this->isBroken('<a name="anchor">anchor</a>'));
		$this->assertFalse($this->isBroken('<a id="anchor">anchor</a>'));
		$this->assertTrue($this->isBroken('<a href="##anchor">anchor</a>'));

		$page = new Page();
		$page->Content = '<a name="yes-name-anchor">name</a><a id="yes-id-anchor">id</a>';
		$page->write();

		$file = new File();
		$file->write();

		$this->assertFalse($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]\">link</a>"));
		$this->assertFalse($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]#yes-name-anchor\">link</a>"));
		$this->assertFalse($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]#yes-id-anchor\">link</a>"));
		$this->assertFalse($this->isBroken("<a href=\"[file_link,id=$file->ID]\">link</a>"));
		$this->assertTrue($this->isBroken("<a href=\"[sitetree_link,id=$page->ID]#http://invalid-anchor.com\"></a>"));
	}

	function highlight($content) {
		$page = new Page();
		$page->Content = $content;
		$page->write();
		return $page->Content;
	}

	function testHighlighter() {
		$content = $this->highlight('<a href="[sitetree_link,id=123]" class="existing-class">link</a>');
		$this->assertEquals(substr_count($content, 'ss-broken'), 1, 'A ss-broken class is added to the broken link.');
		$this->assertEquals(substr_count($content, 'existing-class'), 1, 'Existing class is not removed.');

		$content = $this->highlight('<a href="[sitetree_link,id=123]">link</a>');
		$this->assertEquals(substr_count($content, 'ss-broken'), 1, 'ss-broken class is added to the broken link.');

		$otherPage = new Page();
		$otherPage->Content = '';
		$otherPage->write();

		$content = $this->highlight(
			"<a href=\"[sitetree_link,id=$otherPage->ID]\" class=\"existing-class ss-broken ss-broken\">link</a>"
		);
		$this->assertEquals(substr_count($content, 'ss-broken'), 0, 'All ss-broken classes are removed from good link');
		$this->assertEquals(substr_count($content, 'existing-class'), 1, 'Existing class is not removed.');
	}

}