/**
 * Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com)
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package com.gistlabs.mechanize.document.json.node.hypermedia;

import static org.junit.Assert.assertEquals;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import com.gistlabs.mechanize.document.json.hypermedia.JsonLink;
import com.gistlabs.mechanize.document.json.hypermedia.JsonLinkFinder;
import com.gistlabs.mechanize.document.json.node.JsonNode;
import com.gistlabs.mechanize.document.json.node.JsonNodeTestCase;
import com.gistlabs.mechanize.util.Util;

public class JsonLinkFinderTest extends JsonNodeTestCase {
	JsonNode json;
	JsonLinkFinder finder = new JsonLinkFinder();
	
	@Before
	public void parseJson() {
		String jsonString = Util.getStringFromInputStream(getClass().getResourceAsStream("find-links.json"));
		json = from(jsonString);
	}
	
	@Test
	public void testFindingOneHref() {
		JsonNode one = json.find("one");
		List<JsonLink> links = finder.findOn(one);
		assertEquals(1, links.size());
		
		JsonLink hrefLink = links.get(0);
		assertEquals(hrefLink.node(), one);
	}
	
	@Test
	public void testFindingTwoLinks() {
		JsonNode two = json.find("two");
		List<JsonLink> links = finder.findOn(two);
		assertEquals(2, links.size());
		
		// collect data from the json
		Map<String, String> data = new HashMap<String, String>();
		for (String name : two.getAttributeNames()) {
			data.put(name, two.getAttribute(name));
		}
		
		// make sure the values all match
		for (JsonLink link : links) {
			assertEquals(data.get(link.attrName()), link.uri());
		}
	}
	
	@Test
	public void testFindingThreeLinks() {
		JsonNode three = json.find("three");
		List<JsonLink> links = finder.findOn(three);
		assertEquals(3, links.size());
	}
	
	@Test
	public void testLinkRelIsName() {
		JsonNode one = json.find("rel-is-name");
		List<JsonLink> links = finder.findOn(one);
		assertEquals(1, links.size());
		
		JsonLink hrefLink = links.get(0);
		assertEquals("rel-is-name", hrefLink.linkRel());
	}
	
	@Test
	public void testLinkRelIsRel() {
		JsonNode one = json.find("rel-is-rel");
		List<JsonLink> links = finder.findOn(one);
		assertEquals(1, links.size());
		
		JsonLink hrefLink = links.get(0);
		assertEquals("self", hrefLink.linkRel());
	}
	
	@Test
	public void testLinkRelIsPrefix() {
		JsonNode one = json.find("rel-is-prefix");
		List<JsonLink> links = finder.findOn(one);
		assertEquals(1, links.size());
		
		JsonLink hrefLink = links.get(0);
		assertEquals("prefix", hrefLink.linkRel());
	}
	
	@Test
	public void testNestedLinksDepthOne() {
		JsonNode node = json.find("nested-links");
		List<JsonLink> links = finder.findOn(node);
		assertEquals(1, links.size());
		
		JsonLink hrefLink = links.get(0);
		assertEquals("self", hrefLink.linkRel());
	}
	
	@Test
	public void testNestedLinksDepthChildren() {
		JsonNode node = json.find("nested-links");
		List<JsonLink> links = finder.findWithChildren(node);
		assertEquals(3, links.size());
	}
	
	@Test
	public void testNestedLinksRecursive() {
		JsonNode node = json.find("nested-links");
		List<JsonLink> links = finder.findRecursive(node);
		assertEquals(5, links.size());
	}

}

@@ -3195,32 +3195,158 @@
  links.size());%0A
+%09%09%0A%09%09JsonLink next = links.get(1); // this index is dependent on ordering of children%0A%09%09assertEquals(%22next%22, next.linkRel());%0A
 %09%7D%0A%09%0A%09@Test%0A%09pub

Check the link rel for the next link