/*
* ArticleTest.java
* JUnit based test
*/
package wikipedia.kleinberg;
import wikipedia.util.*;
import wikipedia.sql.PageTable;
import wikipedia.sql.PageNamespace;
import wikipedia.sql.Connect;
import junit.framework.*;
import java.util.*;
public class ArticleTest extends TestCase {
Article node;
int [] articles_id = { 18991, 10484, 3321, 1121};
String[] articles_title = {"title1", "title2", "title3", "title4"};
Map<Integer, Article> map_id_to_article;
Map<String, Article> map_title_article;
public Connect connect, connect_ru;
SessionHolder session;
int categories_max_steps;
public ArticleTest(String testName) {
super(testName);
}
protected void setUp() throws java.lang.Exception {
node = new Article();
float[] x_values = {12.f, 2.f, 7.f, 7.f};
float[] y_values = {20.f, 60.f, 10.f, 10.f};
int i;
map_id_to_article = new HashMap<Integer, Article>();
map_title_article = new HashMap<String, Article>();
for (i=0; i<x_values.length; i++) {
Article source_node = new Article();
source_node.page_id = articles_id [i];
source_node.x = x_values [i];
source_node.y = y_values [i];
map_id_to_article.put(source_node.page_id, source_node);
source_node.page_title = articles_title[i];
map_title_article.put(articles_title[i], source_node);
}
connect = new Connect();
connect.Open(Connect.WP_HOST, Connect.WP_DB, Connect.WP_USER, Connect.WP_PASS);
connect_ru = new Connect();
connect_ru.Open(Connect.WP_RU_HOST,Connect.WP_RU_DB,Connect.WP_RU_USER,Connect.WP_RU_PASS);
session = new SessionHolder();
session.initObjects();
categories_max_steps = 99;
}
protected void tearDown() throws java.lang.Exception {
connect.Close();
connect_ru.Close();
}
public static junit.framework.Test suite() {
junit.framework.TestSuite suite = new junit.framework.TestSuite(ArticleTest.class);
return suite;
}
/**
* Test of joinUnique method, of class wikipedia.Article.
*/
public void testJoinUnique() {
System.out.println("testJoinUnique");
Article[] nodes = new Article[2];
nodes[0] = new Article();
nodes[1] = new Article();
nodes[0].page_id = 12;
nodes[1].page_id = 13;
Article[] addend = new Article[3];
addend[0] = new Article();
addend[1] = new Article();
addend[2] = new Article();
addend[0].page_id = 13;
addend[1].page_id = 7;
addend[2].page_id = 13;
Article[] result = node.joinUnique(nodes, addend);
assertEquals(result.length, 3);
assertEquals(result[0].page_id, 12);
assertEquals(result[1].page_id, 13);
assertEquals(result[2].page_id, 7);
result = node.joinUnique(nodes, null);
assertEquals(result.length, 2);
result = node.joinUnique(null, addend);
assertEquals(result.length, 3);
}
public void testSetType() {
System.out.println("testSetType");
// Rule: type value can decrease, but it do not increase.
Article[] nodes = new Article[3];
nodes[0] = new Article();
nodes[1] = new Article();
nodes[2] = new Article();
nodes[0].type = NodeType.AUTHORITY;
node.SetType (nodes, NodeType.ROOT);
assertEquals(nodes[0].type, NodeType.AUTHORITY);
assertEquals(nodes[1].type, NodeType.ROOT);
assertEquals(nodes[2].type, NodeType.ROOT);
}
public void testNormalizeNewXNewY () {
System.out.println("testNormalizeNewXNewY");
Iterator<Article> it;
// copy x,y to x_new,y_new
it = map_id_to_article.values().iterator();
while (it.hasNext()) {
Article node = it.next();
node.x_new += node.x;
node.y_new += node.y;
}
node.NormalizeNewXNewY(map_id_to_article);
float[] total_error = node.UpdateXY(map_id_to_article);
float links_in_number, sum_x, sum_y, eps;
// get sum x and sum y for each node in map_id_to_article
sum_x = 0.f;
sum_y = 0.f;
it = map_id_to_article.values().iterator();
while (it.hasNext()) {
Article node = it.next();
sum_x += node.x;
sum_y += node.y;
}
eps = 0.001f;
assertTrue(Math.abs(1 - sum_x) < eps);
assertTrue(Math.abs(1 - sum_y) < eps);
}
public void testCreateMapTitleToArticle () {
System.out.println("createMapTitleToArticle");
String[] titles = {"cat", "dog", "hello"};
Article[] nodes = new Article[titles.length];
int i = 0;
for(String t:titles) {
Article a = new Article();
a.page_title = t;
a.page_id = i+1;
nodes[i++] = a;
}
Map<String, Article> m = Article.createMapTitleToArticleWithoutRedirects(nodes);
assertEquals(titles.length, m.size());
}
public void testcreateArticleWithCategories () {
System.out.println("testCreateArticleWithCategories ");
Article a;
int id;
String title;
session.Init(connect, null, categories_max_steps);
session.skipTitlesWithSpaces(false);
session.randomPages(false);
title = "Emotion";
a = Article.createArticleWithCategories(session, title, -1);
assertEquals(null, a);
id = PageTable.getIDByTitle(connect, title); // 9460
a = Article.createArticleWithCategories(session, title, id);
assertFalse(null == a);
assertEquals(title, a.page_title);
}
/** Tests adding of categories to Article.id_categories[] in Russian Wikipedia. */
public void testcreateArticleWithCategories_ru () {
System.out.println("testCreateArticleWithCategories_ru ");
Article a;
int id;
String title;
session.Init(connect_ru, null, categories_max_steps);
session.skipTitlesWithSpaces(false);
session.randomPages(false);
// Робот has two categories: Робототехника | Роботы
title = "Робот";
id = PageTable.getIDByTitle(connect_ru, title);
assertTrue(id > 0);
a = Article.createArticleWithCategories(session, title, id);
assertFalse(null == a);
assertFalse(null == a.id_categories);
assertTrue(a.id_categories.length >= 2); // categories: Робототехника | Роботы | Википедия:Избранные статьи ar-wiki
}
public void testContainTitle () {
System.out.println("testContainTitle");
String title = "Foo";
Article[] n = new Article[20];
Article a = new Article();
a.page_title = title;
n[2] = a;
boolean b = Node.ContainTitle(n, title);
assertTrue(b);
}
public void testContainID () {
System.out.println("testContainID");
int id = 7;
Article[] n = new Article[20];
Article a = new Article();
a.page_id = id;
n[2] = a;
boolean b = Node.ContainID(n, id);
assertTrue(b);
}
public void testGetTitles() {
System.out.println("testGetTitles");
Article[] a = new Article[2];
a[0] = new Article();
a[1] = new Article();
a[0].page_title = "Title1";
a[1].page_title = "Title2";
String[] compare = {"Title1", "Title2"};
String[] s = Node.getTitles(null);
assertEquals(null, s);
s = Node.getTitles(a);
assertEquals(2, s.length);
assertEquals("Title1", s[0]);
assertEquals("Title2", s[1]);
}
public void testGetIdExistedInMap() {
System.out.println("testGetIdExistedInMap");
Set<String> set_titles = new HashSet<String>();
Map<String, Article> local_map_title_article = new HashMap<String, Article>();
int[] result_id;
// null test
result_id = Article.getIdExistedInMap(set_titles, local_map_title_article);
assertEquals(0, result_id.length);
// simple test: get 'articles_id' from 'map_title_article' by 'set_titles'
for(String s:articles_title)
set_titles.add(s);
result_id = Article.getIdExistedInMap(set_titles, map_title_article);
assertEquals(articles_id.length, result_id.length);
// complex test: 'set_titles' has title which is absent in 'map_title_article'
set_titles.add("absent_title");
result_id = Article.getIdExistedInMap(set_titles, map_title_article);
assertEquals(articles_id.length, result_id.length);
}
public void testfillInterWikiTitle_ru() {
System.out.println("testfillInterWikiTitle_ru_en");
// articles category
// "Категория:Числа"
String[] source_ru = {"Робот", "Слово", "Числа"};
String[] compare_en = {"En:Robot", "En:Word", "En:Category:Numbers"};
String[] compare_eo = {"Eo:Roboto", "Eo:Vorto", "Eo:Kategorio:Nombroj"};
session.Init(connect_ru, null, categories_max_steps);
session.skipTitlesWithSpaces(false);
session.randomPages(false);
Article[] a = new Article[2];
a[0] = new Article();
a[1] = new Article();
Category c = new Category();
a[0].page_id = PageTable.getIDByTitleNamespace(connect_ru, source_ru[0], PageNamespace.MAIN);
a[1].page_id = PageTable.getIDByTitleNamespace(connect_ru, source_ru[1], PageNamespace.MAIN);
c.page_id = PageTable.getIDByTitleNamespace(connect_ru, source_ru[2], PageNamespace.CATEGORY);
a[0].fillInterWikiTitle (session, "En", PageNamespace.MAIN);
a[1].fillInterWikiTitle (session, "En", PageNamespace.MAIN);
c.fillInterWikiTitle (session, "En", PageNamespace.MAIN); // Attention! Not NS_CATEGORY, since En:.. - is a simple link, not a category
assertEquals(compare_en[0], a[0].iwiki_title);
assertEquals(compare_en[1], a[1].iwiki_title);
assertEquals(compare_en[2], c.iwiki_title);
a[0].fillInterWikiTitle (session, "Eo", PageNamespace.MAIN);
a[1].fillInterWikiTitle (session, "Eo", PageNamespace.MAIN);
c.fillInterWikiTitle (session, "Eo", PageNamespace.MAIN);
assertEquals(compare_eo[0], a[0].iwiki_title);
assertEquals(compare_eo[1], a[1].iwiki_title);
assertEquals(compare_eo[2], c.iwiki_title);
}
}