diff options
Diffstat (limited to 'tests')
22 files changed, 1315 insertions, 26 deletions
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index 1c1968b..19029aa 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -8,6 +8,10 @@ android:minSdkVersion="4" android:targetSdkVersion="13" /> + <uses-feature + android:name="android.hardware.screen.portrait" + android:required="false" /> + <instrumentation android:name="com.zutubi.android.junitreport.JUnitReportTestRunner" android:targetPackage="cgeo.geocaching" /> diff --git a/tests/res/raw/geokret141_xml.xml b/tests/res/raw/geokret141_xml.xml new file mode 100644 index 0000000..44f7c72 --- /dev/null +++ b/tests/res/raw/geokret141_xml.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> +<gkxml version="1.0" date="2013-06-16 08:22:08"> +<geokrety><geokret id="141" dist="2235" owner_id="122" state="1" type="0" image="1197483279joayp.jpg"><![CDATA[WeltenbummlerKret]]></geokret> +</geokrety> +</gkxml>
\ No newline at end of file diff --git a/tests/res/raw/tb123e_html.html b/tests/res/raw/tb123e_html.html new file mode 100644 index 0000000..3c933cc --- /dev/null +++ b/tests/res/raw/tb123e_html.html @@ -0,0 +1,877 @@ +
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+<head id="ctl00_Head1"><meta charset="utf-8" />
+ <!--[if IE]><![endif]-->
+ <title>
+ Geocaching > Trackable Items > Trackable Item Details
+</title><meta name="DC.title" content="Geocaching - The Official Global GPS Cache Hunt Site" /><meta name="author" content="Groundspeak, Inc." /><meta name="DC.creator" content="Groundspeak, Inc." /><meta name="Copyright" content="Copyright (c) 2000-2013 Groundspeak, Inc. All Rights Reserved." /><!-- Copyright (c) 2000-2013 Groundspeak, Inc. All Rights Reserved. --><meta name="description" content="Geocaching is a treasure hunting game where you use a GPS to hide and seek containers with other participants in the activity. Geocaching.com is the listing service for geocaches around the world." /><meta name="DC.subject" content="Geocaching is a treasure hunting game where you use a GPS to hide and seek containers with other participants in the activity. Geocaching.com is the listing service for geocaches around the world." /><meta http-equiv="imagetoolbar" content="no" /><meta name="distribution" content="global" /><meta name="MSSmartTagsPreventParsing" content="true" /><meta name="rating" content="general" /><meta name="revisit-after" content="1 days" /><meta name="robots" content="all" /><link rel="icon" href="/favicon.ico" /><link rel="shortcut icon" href="/favicon.ico" /><link rel="apple-touch-icon" href="/apple-touch-icon.png" /><link rel="stylesheet" type="text/css" media="all" href="../css/blueprint/src/reset.css" /><link rel="stylesheet" type="text/css" media="all" href="../css/blueprint/src/typography.css" /><link rel="stylesheet" type="text/css" media="screen,projection" href="../css/blueprint/src/grid.css" />
+ <!--[if lt IE 8]>
+ <link rel="stylesheet" type="text/css" media="all" href="../css/blueprint/ie.css" />
+ <![endif]-->
+ <link id="uxCssMaster" rel="stylesheet" type="text/css" media="screen,projection" href="../css/tlnMasterScreen.css?r=1" /><link id="uxCssMain" rel="stylesheet" type="text/css" media="all" href="../css/tlnMain.css?r=1" /><link rel="Stylesheet" type="text/css" media="all" href="../css/jqueryui1810/jquery-ui-1.8.10.custom.css" /><link rel="stylesheet" type="text/css" media="all" href="/js/jquery_plugins/jquery.jgrowl.css" /><link rel="stylesheet" type="text/css" media="print" href="../css/tlnMasterPrint.css" />
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ </script>
+ <script type="text/javascript" src="/js/modernizr-1.7.min.js"></script>
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
+
+ <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js" type="text/javascript"></script>
+ <script type="text/javascript" src="/js/jquery.truncate.min.js"></script>
+
+ <script type='text/javascript'>
+ var googletag = googletag || {};
+ googletag.cmd = googletag.cmd || [];
+ (function () {
+ var gads = document.createElement('script');
+ gads.async = true;
+ gads.type = 'text/javascript';
+ var useSSL = 'https:' == document.location.protocol;
+ gads.src = (useSSL ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js';
+ var node = document.getElementsByTagName('script')[0];
+ node.parentNode.insertBefore(gads, node);
+ })();
+ </script>
+
+
+ <link href="/css/fancybox/jquery.fancybox.css" rel="stylesheet" type="text/css" />
+ <style type="text/css" media="screen">
+ .MasterPageAds{
+ margin-top:0;
+ }
+ .CoordInfoLinkWidget{
+ margin-right:-175px;
+ }
+ ul.imagelist li, ul.log_images li
+ {
+ list-style: none;
+ }
+ ul.log_images li
+ {
+ float: left;
+ margin-right: 5px;
+ }
+ ul.pager
+ {
+ padding: 0 !important;
+ margin: 5px 0 !important;
+ width: 100%;
+ overflow: hidden;
+ }
+ ul.pager li
+ {
+ float: left;
+ list-style: none;
+ }
+ ul.pager li.pager-info
+ {
+ margin: 2px 5px 0 0 !important;
+ }
+ ul.pager li.pager-current
+ {
+ border: 1px solid #003F7E;
+ color: #c00;
+ font-weight: bold;
+ margin: 0 5px 0 0;
+ padding: 1px 5px;
+ }
+ ul.pager li a
+ {
+ border: 1px solid #ccc;
+ display: block;
+ margin: 0 5px 0 0;
+ padding: 1px 5px;
+ text-decoration: none;
+ }
+ ul.pager li a:hover
+ {
+ border-color: #003F7E;
+ }
+ .LogImgTitle, .LogImgDescription
+ {
+ text-align: center !important;
+ width: 100%;
+ }
+ .TrackableItemOptionsTable
+ {
+ clear:both;
+ }
+ </style>
+<meta name="og:site_name" content="Geocaching.com" property="og:site_name" /><meta name="og:type" content="article" property="og:type" /><meta name="fb:app_id" content="251051881589204" property="fb:app_id" /><meta name="og:url" content="http://www.geocaching.com/track/details.aspx?tracker=TB123E" property="og:url" /><meta name="og:description" property="og:description" /><meta name="og:image" content="http://www.geocaching.com/images/facebook/wpttypes/14.png" property="og:image" /><meta name="og:title" content="Travel Bug Dog Tag" property="og:title" /></head>
+<body >
+ <form name="aspnetForm" method="post" action="details.aspx?tracker=TB123E" onsubmit="javascript:return WebForm_OnSubmit();" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_btnSignIn')" id="aspnetForm">
+<div>
+<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
+<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
+<input type="hidden" name="__VIEWSTATEFIELDCOUNT" id="__VIEWSTATEFIELDCOUNT" value="2" />
+<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTM3NDI4MjQ0OA8WAh4MVEJEZXRhaWxzLklEKClZU3lzdGVtLkludDY0LCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkENDY3MBYCZg9kFgZmD2QWCgIGDxYCHgRUZXh0BWI8bWV0YSBuYW1lPSJDb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMC0yMDEzIEdyb3VuZHNwZWFrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIiAvPmQCBw8WAh8BBUc8IS0tIENvcHlyaWdodCAoYykgMjAwMC0yMDEzIEdyb3VuZHNwZWFrLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIC0tPmQCGQ8WAh4EaHJlZgUdfi9jc3MvdGxuTWFzdGVyU2NyZWVuLmNzcz9yPTFkAhoPFgIfAgUVfi9jc3MvdGxuTWFpbi5jc3M/cj0xZAIfDxYCHgdWaXNpYmxlaGQCAQ9kFgwCCw8WAh8BZGQCDQ9kFgoCAw8WAh8DZxYCAh0PDxYCHgtQb3N0QmFja1VybAVeaHR0cHM6Ly93d3cuZ2VvY2FjaGluZy5jb20vbG9naW4vZGVmYXVsdC5hc3B4P3JlZGlyPSUyZnRyYWNrJTJmZGV0YWlscy5hc3B4JTNmdHJhY2tlciUzZFRCMTIzRWRkAgUPZBYCAgUPDxYCHgtOYXZpZ2F0ZVVybAWFAWh0dHBzOi8vd3d3Lmdlb2NhY2hpbmcuY29tL2xvZ2luL2RlZmF1bHQuYXNweD9SRVNFVD1ZJnJlZGlyPWh0dHAlM2ElMmYlMmZ3d3cuZ2VvY2FjaGluZy5jb20lMmZ0cmFjayUyZmRldGFpbHMuYXNweCUzZnRyYWNrZXIlM2RUQjEyM0VkZAINDxYCHwNnZAIfDxYCHwNnZAJLD2QWBAIDDxYCHwEFB0VuZ2xpc2hkAgUPFgIeC18hSXRlbUNvdW50AhMWJmYPZBYCAgEPDxYIHg9Db21tYW5kQXJndW1lbnQFBWVuLVVTHgtDb21tYW5kTmFtZQUNU2V0VGVtcExvY2FsZR8BBQdFbmdsaXNoHhBDYXVzZXNWYWxpZGF0aW9uaGRkAgEPZBYCAgEPDxYIHwcFBWRlLURFHwgFDVNldFRlbXBMb2NhbGUfAQUHRGV1dHNjaB8JaGRkAgIPZBYCAgEPDxYIHwcFBWZyLUZSHwgFDVNldFRlbXBMb2NhbGUfAQUJRnJhbsOnYWlzHwloZGQCAw9kFgICAQ8PFggfBwUFcHQtUFQfCAUNU2V0VGVtcExvY2FsZR8BBQpQb3J0dWd1w6pzHwloZGQCBA9kFgICAQ8PFggfBwUFY3MtQ1ofCAUNU2V0VGVtcExvY2FsZR8BBQnEjGXFoXRpbmEfCWhkZAIFD2QWAgIBDw8WCB8HBQVzdi1TRR8IBQ1TZXRUZW1wTG9jYWxlHwEFB1N2ZW5za2EfCWhkZAIGD2QWAgIBDw8WCB8HBQVlcy1FUx8IBQ1TZXRUZW1wTG9jYWxlHwEFCEVzcGHDsW9sHwloZGQCBw9kFgICAQ8PFggfBwUFZXQtRUUfCAUNU2V0VGVtcExvY2FsZR8BBQVFZXN0aR8JaGRkAggPZBYCAgEPDxYIHwcFBWl0LUlUHwgFDVNldFRlbXBMb2NhbGUfAQUISXRhbGlhbm8fCWhkZAIJD2QWAgIBDw8WCB8HBQVlbC1HUh8IBQ1TZXRUZW1wTG9jYWxlHwEFEM6VzrvOu863zr3Ouc66zqwfCWhkZAIKD2QWAgIBDw8WCB8HBQVsdi1MVh8IBQ1TZXRUZW1wTG9jYWxlHwEFCUxhdHZpZcWhdR8JaGRkAgsPZBYCAgEPDxYIHwcFBW5sLU5MHwgFDVNldFRlbXBMb2NhbGUfAQUKTmVkZXJsYW5kcx8JaGRkAgwPZBYCAgEPDxYIHwcFBWNhLUVTHwgFDVNldFRlbXBMb2NhbGUfAQUHQ2F0YWzDoB8JaGRkAg0PZBYCAgEPDxYIHwcFBXBsLVBMHwgFDVNldFRlbXBMb2NhbGUfAQUGUG9sc2tpHwloZGQCDg9kFgICAQ8PFggfBwUFbmItTk8fCAUNU2V0VGVtcExvY2FsZR8BBQ5Ob3JzaywgQm9rbcOlbB8JaGRkAg8PZBYCAgEPDxYIHwcFBWtvLUtSHwgFDVNldFRlbXBMb2NhbGUfAQUJ7ZWc6rWt7Ja0HwloZGQCEA9kFgICAQ8PFggfBwUFaHUtSFUfCAUNU2V0VGVtcExvY2FsZR8BBQZNYWd5YXIfCWhkZAIRD2QWAgIBDw8WCB8HBQVyby1STx8IBQ1TZXRUZW1wTG9jYWxlHwEFCFJvbcOibsSDHwloZGQCEg9kFgICAQ8PFggfBwUFamEtSlAfCAUNU2V0VGVtcExvY2FsZR8BBQnml6XmnKzoqp4fCWhkZAITDxYCHgVjbGFzcwUHc3Bhbi0yMBYCAgEPZBYQAgMPZBYCZg9kFgICAQ8PFgIfAQUGVEIxMjNFZGQCBQ8PFgQeCEltYWdlVXJsBTBodHRwOi8vd3d3Lmdlb2NhY2hpbmcuY29tL2ltYWdlcy93cHR0eXBlcy8yMS5naWYeDUFsdGVybmF0ZVRleHQFElRyYXZlbCBCdWcgRG9nIFRhZ2RkAgcPDxYCHwEFElRyYXZlbCBCdWcgRG9nIFRhZ2RkAgkPDxYEHwEF6gE8cCBjbGFzcz0iV2FybmluZyI+PGltZyBzcmM9Ii9pbWFnZXMvaWNvbnMvMTYvdHJhY2thYmxlX2Vycm9yLnBuZyIgYWx0PSdBdHRlbnRpb24hJyAvPlRoaXMgVHJhY2thYmxlICg8c3Ryb25nPlRyYXZlbCBCdWcgRG9nIFRhZzwvc3Ryb25nPikgaGFzbid0IGJlZW4gYWN0aXZhdGVkLiA8YSBocmVmPSJhY3RpdmF0ZS5hc3B4IiB0aXRsZT0iQWN0aXZhdGUgSXQgTm93Ij5BY3RpdmF0ZSBpdCBub3c8L2E+LjwvcD4fA2dkZAINDw8WAh8DaGQWFmYPZBYCZg8PFgIfAQUiPHN0cm9uZz5UcmFja2FibGUgT3B0aW9uczwvc3Ryb25nPmRkAgEPZBYCZg9kFgJmDw8WBB8FBWtodHRwczovL3d3dy5nZW9jYWNoaW5nLmNvbS9sb2dpbi8/UkVTRVQ9WSZyZWRpcj1odHRwOi8vd3d3Lmdlb2NhY2hpbmcuY29tL3RyYWNrL2RldGFpbHMuYXNweD90cmFja2VyPVRCMTIzRR8BBRhGb3VuZCB0aGlzIGl0ZW0/IExvZyBpbi5kZAICDw8WAh8DaGRkAgMPDxYCHwNoZGQCBA8PFgIfA2hkZAIFDw8WAh8DaGRkAgYPZBYCZg9kFgJmDw8WAh8FBTx+L3RyYWNrL3NoZWV0LmFzcHg/Z3VpZD1hNWM3YmYwMS1iMDI4LTRhMDAtODIzMS1lNDIwZjZiZDI2ZTdkZAIHDw8WAh8DaGRkAggPDxYCHwNoZGQCDA8PFgIfA2hkZAINDw8WAh8DaGQWAmYPZBYCZg8QZGQWAGQCDw8PFgQeC0J1Z1BhbmVsLklEKCsEBDQ2NzAfA2hkZAITDw8WAh8DaGRkAhUPDxYCHwNnZGQCFQ8WAh8KBQtzcGFuLTQgbGFzdBYCAgEPD2QWAh4Fc3R5bGUFDHdpZHRoOjE2MHB4O2QCFw9kFgQCAw8WAh8BBQdFbmdsaXNoZAIFDxYCHwYCExYmZg9kFgICAQ8PFggfBwUFZW4tVVMfCAUNU2V0VGVtcExvY2FsZR8BBQdFbmdsaXNoHwloZGQCAQ9kFgICAQ8PFggfBwUFZGUtREUfCAUNU2V0VGVtcExvY2FsZR8BBQdEZXV0c2NoHwloZGQCAg9kFgICAQ8PFggfBwUFZnItRlIfCAUNU2V0VGVtcExvY2FsZR8BBQlGcmFuw6dhaXMfCWhkZAIDD2QWAgIBDw8WCB8HBQVwdC1QVB8IBQ1TZXRUZW1wTG9jYWxlHwEFClBvcnR1Z3XDqnMfCWhkZAIED2QWAgIBDw8WCB8HBQVjcy1DWh8IBQ1TZXRUZW1wTG9jYWxlHwEFCcSMZcWhdGluYR8JaGRkAgUPZBYCAgEPDxYIHwcFBXN2LVNFHwgFDVNldFRlbXBMb2NhbGUfAQUHU3ZlbnNrYR8JaGRkAgYPZBYCAgEPDxYIHwcFBWVzLUVTHwgFDVNldFRlbXBMb2NhbGUfAQUIRXNwYcOxb2wfCWhkZAIHD2QWAgIBDw8WCB8HBQVldC1FRR8IBQ1TZXRUZW1wTG9jYWxlHwEFBUVlc3RpHwloZGQCCA9kFgICAQ8PFggfBwUFaXQtSVQfCAUNU2V0VGVtcExvY2FsZR8BBQhJdGFsaWFubx8JaGRkAgkPZBYCAgEPDxYIHwcFBWVsLUdSHwgFDVNldFRlbXBMb2NhbGUfAQUQzpXOu867zrfOvc65zrrOrB8JaGRkAgoPZBYCAgEPDxYIHwcFBWx2LUxWHwgFDVNldFRlbXBMb2NhbGUfAQUJTGF0dmllxaF1HwloZGQCCw9kFgICAQ8PFggfBwUFbmwtTkwfCAUNU2V0VGVtcExvY2FsZR8BBQpOZWRlcmxhbmRzHwloZGQCDA9kFgICAQ8PFggfBwUFY2EtRVMfCAUNU2V0VGVtcExvY2FsZR8BBQdDYXRhbMOgHwloZGQCDQ9kFgICAQ8PFggfBwUFcGwtUEwfCAUNU2V0VGVtcExvY2FsZR8BBQZQb2xza2kfCWhkZAIOD2QWAgIBDw8WCB8HBQVuYi1OTx8IBQ1TZXRUZW1wTG9jYWxlHwEFDk5vcnNrLCBCb2ttw6VsHwloZGQCDw9kFgICAQ8PFggfBwUFa28tS1IfCAUNU2V0VGVtcExvY2FsZR8BBQntlZzqta3slrQfCWhkZAIQD2QWAgIBDw8WCB8HBQVodS1IVR8IBQ1TZXRUZW1wTG9jYWxlHwEFBk1hZ3lhch8JaGRkAhEPZBYCAgEPDxYIHwcF" />
+<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="BXJvLVJPHwgFDVNldFRlbXBMb2NhbGUfAQUIUm9tw6JuxIMfCWhkZAISD2QWAgIBDw8WCB8HBQVqYS1KUB8IBQ1TZXRUZW1wTG9jYWxlHwEFCeaXpeacrOiqnh8JaGRkAksPFgIfAQUQJmNvcHk7IDIwMDAtMjAxM2QCAw8WAh8BBStTZXJ2ZXI6IFdFQjE1OyBCdWlsZDogV2ViLkhvdEZpeF8yMDEzMDYxMS4xZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUSY3RsMDAkY2JSZW1lbWJlck1lPdC9wWLlFkz2FeUukOGHwoH4Qbo=" />
+</div>
+
+<script type="text/javascript">
+//<![CDATA[
+var theForm = document.forms['aspnetForm'];
+if (!theForm) {
+ theForm = document.aspnetForm;
+}
+function __doPostBack(eventTarget, eventArgument) {
+ if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
+ theForm.__EVENTTARGET.value = eventTarget;
+ theForm.__EVENTARGUMENT.value = eventArgument;
+ theForm.submit();
+ }
+}
+//]]>
+</script>
+
+
+<script src="/WebResource.axd?d=Dh2VENdI9XyWNN0f7DnYfR8WWRCRIzdVqal2y0yjiQ5nC_eHhLchYgnQDHIk0d3RCcSUMVZ36ciRD0qmhXKmeu3S_RE1&t=634981136634411315" type="text/javascript"></script>
+
+
+<script src="/ScriptResource.axd?d=8q09cuy9-PZDS8eZx6HLVXd3YZywgUmuoy8VVtGr3vaISS8ybaBLyQLFlq93nr2dlYP0QJWcJvooQKkloTdALTrS571k1UcPpD2pbXbpthIOf2Mn8gCnpyvfv-ZudWTMi0y39YZC0-Q0yjjxQ82yTlKdhBw1&t=150492e7" type="text/javascript"></script>
+<script src="/ScriptResource.axd?d=I9_m2Hb1Tv_B0qTMDG8bMbnkNSHUkv5oUaG9-V5NZ8qQ2VFlu60I8y8gfr3vPmZjbiPnu43MOQdFVDeYF-nDAEKBLmyxD3DCTGmes9NNbbvaDEHyEuuRWgccIkK3ik5TI48YGDxjHjqdn-gTK4Fkgd17LGw1&t=ffffffff940d030f" type="text/javascript"></script>
+<script src="/ScriptResource.axd?d=8vNbe34dAujgZMPnfnacfjeoweX1vHgyns8KlAV4vpGpsZC9Cf3pro__lv8ekBa0NiCgXGMMolzOUNH__lrnEI_qjlNBIAuuLeemtAXV_i6E0QIMZa8nGSYmWGF5nQOJK3rmZzvTxsr2Mh4Ebdba_1ywGLUSH_U_XIe-jzecfRQwwvjZ0&t=ffffffff940d030f" type="text/javascript"></script>
+<script src="/ScriptResource.axd?d=GOLGf77ZX6urEYf5Cg_l0ie9kWEGMu6XJMB7V1W0y_T0ZHAQx1nqrvH4nS3Bd1UlB4KJ0-apCBVwzxwWFhcyWq6Mb4W_l5ChkNoKVRbRgSdsqHaINGCvfTh-Xlc6A43jbSbHZPqZXuRx6l77VNJliDwnzeqaR6rOGx-bITJ5Ucpg2LG4c-dv5WgQ5ubixToUFzLOhih1vbqpBrUsntSxk1Ja38c1" type="text/javascript"></script>
+<script src="/ScriptResource.axd?d=D73YDIzBf7Ie7aEM8go5MHSjFGcfmjQmvpic2heYHDtQYqmKwdt34dMz4K3Ih4PuqodTDp2lDypwsCMnDfViOhnOocylUNAEdhl6X9_ny5t8XhdMnQzNj9zaOXspXEC5a1PHTg2" type="text/javascript"></script>
+<script src="/WebResource.axd?d=Np8DmZmh2tcIkgE9SU7mE6n1BWbJ0opng-rHikqBjFQo0nbLYSeBBVhJhCHcmx1ihKnAnQv_ZhnItUUjENzIzc1uoXk1&t=634981136634411315" type="text/javascript"></script>
+<script type="text/javascript">
+//<![CDATA[
+function WebForm_OnSubmit() {
+if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;
+return true;
+}
+//]]>
+</script>
+
+<div>
+
+ <input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE" value="oJ2vMc_wjAUsI8uitLTiwYMiz9Z-iPQ0NBSttGTzhOx1wp3B2PVYaxCkmibTiuq2TKWnEfVrZoFL1sFtgd1KsT9I3Fg1" />
+</div>
+ <script type="text/javascript">
+//<![CDATA[
+Sys.WebForms.PageRequestManager._initialize('ctl00$uxMainScriptManager', 'aspnetForm', [], [], [], 90, 'ctl00');
+//]]>
+</script>
+
+ <div id="Top" class="SkipLinks">
+ <a id="ctl00_hlSkipLinksNavigation" accesskey="n" title="Skip to Navigation" href="#Navigation">Skip to Navigation</a>
+ <a id="ctl00_hlSkipLinksContent" accesskey="c" title="Skip to Content" href="#Content">Skip to Content</a>
+ </div>
+ <!--[if lte IE 7]>
+ <div class="WarningMessage PhaseOut">
+ <p>Groundspeak is phasing out support for older browsers. Visit the <a href="http://support.groundspeak.com/index.php?pg=kb.page&id=215" title="Browser Support Information">Help Center</a> for more information.</p>
+ </div>
+ <![endif]-->
+
+
+ <div class="PrintOnly">
+ <p>
+ <img src="/images/logo_print_bw.png" alt="Geocaching.com" />
+ </p>
+ <hr />
+ </div>
+ <header id="ctl00_siteHeader">
+ <div class="container">
+ <h1 class="Logo span-16">
+ <a href="../" id="ctl00_HDHomeLink" title="Geocaching" accesskey="h">Geocaching</a>
+ </h1>
+ <div class="ProfileWidget span-8 last">
+ <div id="ctl00_divNotSignedIn" class="FloatContainer">
+ <p class="NotSignedInText"><strong>
+ Welcome, Visitor!</strong><br />
+ </p>
+ <p class="LoginWithFacebook">
+ <a id="ctl00_uxSignIn" title="Login with Facebook" class="btnFacebookLogin NoWrap" href="javascript:__doPostBack('ctl00$uxSignIn','')"><span>
+ Login with Facebook</span></a>
+ </p>
+ <p class="NotSignedInLinks clear">
+ <a id="hlSignIn" accesskey="s" title="Sign In" class="SignInLink" href="/login/">Sign In</a> | <a id="ctl00_hlRegister" accesskey="r" title="Sign Up" href="../membership/register.aspx?type=basic">Sign Up</a>
+ </p>
+ <div id="SignInWidget">
+ <h3>
+ Sign In with Geocaching</h3>
+ <div id="ctl00_vsSignInWidgetForm" class="FormSummaryWidget FormErrorWidget InputWidth" style="color:Red;display:none;">
+
+</div>
+ <p>
+ <label for="ctl00_tbUsername" id="ctl00_lblUsername" title="Geocaching Username">Geocaching Username:</label><br />
+ <input name="ctl00$tbUsername" type="text" id="ctl00_tbUsername" class="text" autocomplete="off" />
+ <span id="ctl00_rfvUsername" title="Username is a required field; please enter a valid username." style="color:Red;display:none;"><span class="FormIcon FormValidationIcon">*</span></span>
+ </p>
+ <p>
+ <label for="ctl00_tbPassword" id="ctl00_lblPassword" title="Geocaching Password">Geocaching Password:</label><br />
+ <input name="ctl00$tbPassword" type="password" id="ctl00_tbPassword" class="text" autocomplete="off" />
+ <span id="ctl00_rfvPassword" title="Password is a required field; please enter a valid password." style="color:Red;display:none;"><span class="FormIcon FormValidationIcon">*</span></span>
+ </p>
+ <p>
+ <span class="Checkbox" title="Keep Me Signed In" autocomplete="off"><input id="ctl00_cbRememberMe" type="checkbox" name="ctl00$cbRememberMe" /><label for="ctl00_cbRememberMe">Keep Me Signed In</label></span><br />
+ <small>
+ Uncheck if on a shared computer.</small>
+ </p>
+ <p>
+ <input type="submit" name="ctl00$btnSignIn" value="Sign In" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$btnSignIn", "", true, "SignInForm", "https://www.geocaching.com/login/default.aspx?redir=%2ftrack%2fdetails.aspx%3ftracker%3dTB123E", false, false))" id="ctl00_btnSignIn" title="Sign In" />
+ or
+ <a id="ctl00_hlSignInClose" title="Close this Window" class="SignInCloseLink" href="javascript:void(0);">Close</a>
+ </p>
+ <p>
+ <small>
+ <a id="ctl00_hlForgot" title="Forgot your username or password?" href="../login/password.aspx">Forgot your username or password?</a></small>
+ </p>
+ </div>
+ </div>
+
+ </div>
+ <div class="NavContainer span-24 last">
+ <nav id="Navigation">
+ <ul class="Menu">
+ <li>
+ <a id="ctl00_hlNavLearn" accesskey="1" title="Learn" href="../guide/">Learn ▼</a>
+ <ul class="SubMenu">
+ <li>
+ <a id="ctl00_hlSubNavGeocaching101" accesskey="i" title="Geocaching 101" href="../guide/">Geocaching 101</a></li>
+ <li>
+ <a id="ctl00_hlSubNavGeocaching2Minutes" title="Geocaching in 2 Minutes" href="../videos/#cat=cat:newbies&vid=-4VFeYZTTYs">Geocaching in 2 Minutes</a></li>
+ </ul>
+ </li>
+ <li id="ctl00_liNavJoin">
+ <a id="ctl00_hlNavJoin" accesskey="2" title="Join" href="../membership/register.aspx?type=basic">Join</a></li>
+
+ <li>
+ <a id="ctl00_hlNavPlay" accesskey="3" title="Play" href="../seek/">Play ▼</a>
+ <ul class="SubMenu">
+ <li>
+ <a id="ctl00_hlSubNavHide" accesskey="d" title="Hide & Seek a Cache" href="../seek/">Hide & Seek a Cache</a></li>
+ <li>
+ </li>
+ <li>
+ <a id="ctl00_hlSubNavMap" accesskey="/" title="View Geocache Map" href="../map/">View Geocache Map</a></li>
+ <li>
+ <a id="ctl00_hlSubNavTrackables" accesskey="e" title="Find Trackables" href="./">Find Trackables</a></li>
+ <li>
+ <a id="ctl00_hlSubNavHelpCenter" title="Help Center" rel="external" href="http://support.groundspeak.com/index.php">Help Center</a></li>
+ </ul>
+ </li>
+ <li>
+ <a id="ctl00_hlNavCommunity" accesskey="6" title="Community" href="../forums/">Community ▼</a>
+ <ul class="SubMenu">
+
+ <li>
+ <a id="ctl00_hlSubNavTellaFriend" accesskey="-" title="Tell a Friend" href="../account/SendReferral.aspx">Tell a Friend</a>
+ </li>
+
+ <li>
+ <a id="ctl00_hlSubNavVolunteers" accesskey="+" title="Volunteers" href="../volunteers/">Volunteers</a></li>
+ <li>
+ <a id="ctl00_hlSubNavLocal" accesskey="z" title="Local Organizations" href="../organizations/">Local Organizations</a></li>
+ <li>
+ <a id="ctl00_hlSubNavDiscussionForums" accesskey="f" title="Discussion Forums" href="../forums/">Discussion Forums</a></li>
+ <li>
+ <a id="ctl00_hlSubNavBlog" accesskey="b" title="Blog" rel="external" href="http://blog.geocaching.com/">Blog</a></li>
+ <li>
+ <a id="ctl00_hlSubNavEvents" accesskey="v" title="Events" href="../calendar/">Events</a></li>
+ </ul>
+ </li>
+ <li>
+ <a id="ctl00_hlNavShop" accesskey="4" title="Shop" href="http://shop.geocaching.com/">Shop ▼</a>
+ <ul class="SubMenu">
+ <li>
+ <a id="ctl00_hlSubNavShop" accesskey="j" title="Shop Geocaching" rel="external" href="http://shop.geocaching.com/">Shop Geocaching</a></li>
+ <li>
+ <a id="ctl00_hlSubNavIntlRetailers" title="International Retailers" rel="external" href="http://shop.geocaching.com/default/international-retailers/">International Retailers</a></li>
+ <li>
+ <a id="ctl00_hlSubNavGPSReviews" accesskey="w" title="GPS Reviews" href="/reviews/gps">GPS Reviews</a></li>
+ <li>
+ <a id="ctl00_hlSubNavGPSGuide" accesskey="k" title="Guide to Buying a GPS Device" href="../about/buying.aspx">Guide to Buying a GPS Device</a></li>
+ </ul>
+ </li>
+ <li>
+ <a id="ctl00_hlNavPartnering" accesskey="5" title="Partnering" href="../travel/">Partnering ▼</a>
+ <ul class="SubMenu">
+ <li>
+ <a id="ctl00_hlSubNavTravel" title="Travel and GeoTourism" href="../travel/">Travel and GeoTourism</a></li>
+ <li>
+ <a id="ctl00_hlSubNavBrandedPromotions" title="Branded Promotions" href="../brandedpromotions/">Branded Promotions</a></li>
+ <li>
+ <a id="ctl00_hlSubNavEducation" title="Geocaching and Education" href="../education/">Geocaching and Education</a></li>
+ <li>
+ <a id="ctl00_hlSubNavAdvertisingWithUs" title="Advertising with Us" href="../about/advertising.aspx">Advertising with Us</a></li>
+ <li>
+ <a id="ctl00_hlSubNavAPIProgram" title="API Program" href="../live/apidevelopers/">API Program</a></li>
+ </ul>
+ </li>
+ <li>
+ <a id="ctl00_hlNavVideos" accesskey="7" title="Videos" href="../videos/">Videos</a></li>
+ <li>
+ <a id="ctl00_hlNavFollowUs" title="Follow Us" href="http://www.facebook.com/geocaching">Follow Us ▼</a>
+ <ul class="SubMenu NavSocialMedia">
+ <li>
+ <a id="ctl00_hlSubNavFacebook" title="Facebook" class="SubNavFacebook" href="http://www.facebook.com/geocaching">Facebook</a></li>
+ <li>
+ <a id="ctl00_hlSubNavTwitter" title="Twitter" class="SubNavTwitter" href="http://twitter.com/GoGeocaching">Twitter</a></li>
+ <li>
+ <a id="ctl00_hlSubNavYouTube" title="YouTube" class="SubNavYouTube" href="http://www.youtube.com/user/GoGeocaching">YouTube</a></li>
+ </ul>
+ </li>
+ </ul>
+ </nav>
+ <div class="LanguageSelector">
+
+
+<div class="LocaleText">
+
+ <strong>Choose Your Language:</strong>
+
+</div>
+<div class="LocaleList">
+
+ <div class="selected-language">
+
+ <a href="#">English▼</a>
+
+ </div>
+ <ul class="language-list">
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl00_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl00$uxLocaleItem','')">English</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl01_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl01$uxLocaleItem','')">Deutsch</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl02_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl02$uxLocaleItem','')">Français</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl03_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl03$uxLocaleItem','')">Português</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl04_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl04$uxLocaleItem','')">Čeština</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl05_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl05$uxLocaleItem','')">Svenska</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl06_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl06$uxLocaleItem','')">Español</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl07_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl07$uxLocaleItem','')">Eesti</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl08_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl08$uxLocaleItem','')">Italiano</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl09_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl09$uxLocaleItem','')">Ελληνικά</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl10_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl10$uxLocaleItem','')">Latviešu</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl11_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl11$uxLocaleItem','')">Nederlands</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl12_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl12$uxLocaleItem','')">Català</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl13_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl13$uxLocaleItem','')">Polski</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl14_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl14$uxLocaleItem','')">Norsk, Bokmål</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl15_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl15$uxLocaleItem','')">한국어</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl16_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl16$uxLocaleItem','')">Magyar</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl17_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl17$uxLocaleItem','')">Română</a></li>
+
+ <li><a id="ctl00_uxLocaleListTop_uxLocaleList_ctl18_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleListTop$uxLocaleList$ctl18$uxLocaleItem','')">日本語</a></li>
+
+ </ul>
+
+</div>
+<script type="text/javascript">
+
+ jQuery(document).ready(function () {
+ jQuery(".selected-language a").click(function (e) {
+ e.preventDefault();
+ var $loc = jQuery(this).parent().next();
+ jQuery($loc).show().position({
+ of: $loc.parent(),
+ my: "left top",
+ at: "left bottom",
+ offset: "0 0",
+ collision: "fit fit"
+ });
+ jQuery(this).addClass("Expanded");
+ jQuery(document).click(function () {
+ jQuery(".language-list").fadeOut("fast");
+ jQuery(".selected-language a").removeClass("Expanded");
+ });
+ return false;
+ });
+ });
+</script>
+ </div>
+ </div>
+ </div>
+ </header>
+ <section id="Content">
+
+ <div class="container">
+ <div id="ctl00_divBreadcrumbs" class="BreadcrumbWidget span-24 last">
+ <p>
+ <span id="ctl00_Breadcrumbs"><span><a title="Geocaching - The Official Global GPS Cache Hunt Site" href="/">Geocaching</a></span><span> > </span><span><a title="Trackables" href="/track/default.aspx">Trackables</a></span><span> > </span><span>Trackable Item Details</span></span>
+ </p>
+
+ </div>
+ <div id="ctl00_divContentMain" class="span-20">
+
+
+ <div id="ctl00_ContentBody_CoordInfoLinkControl1_uxCoordInfoLinkPanel" class="CoordInfoLinkWidget">
+
+ <p>
+ <a href="#" class="CoordInfoLink">
+ <span id="ctl00_ContentBody_CoordInfoLinkControl1_uxCoordInfoCode" class="CoordInfoCode">TB123E</span>
+ <span class="arrow">▼</span> </a>
+ </p>
+
+</div>
+<div id="dlgClipboard">
+ <input type="text" class="TextFormat" />
+ <a href="#" onclick="$('#dlgClipboard').hide();return false;" title="Close" class="Close">
+ x</a>
+</div>
+<script type="text/javascript">
+ $("a.CoordInfoLink").click(function (e) {
+ e.preventDefault();
+
+ $("#dlgClipboard")
+ .show()
+ .position({
+ of: $("a.CoordInfoLink"),
+ my: "right top",
+ at: "right bottom",
+ offset: "0 5"
+ })
+ .find("input")
+ .val('http://coord.info/' + $('.CoordInfoCode').text())
+ .focus()
+ .select();
+
+ $(document).mouseup(function (e) {
+ if ($(e.target).parent("div#dlgClipboard").length == 0) {
+ $(this).unbind(e);
+ $("div#dlgClipboard").hide();
+ }
+ });
+
+ return false;
+ });
+
+
+</script>
+
+ <h2 class="WrapFix">
+ <img id="ctl00_ContentBody_BugTypeImage" class="TravelBugHeaderIcon" src="http://www.geocaching.com/images/wpttypes/21.gif" alt="Travel Bug Dog Tag" style="border-width:0px;" />
+ <span id="ctl00_ContentBody_lbHeading">Travel Bug Dog Tag</span>
+ </h2>
+ <span id="ctl00_ContentBody_ErrorMessage"><p class="Warning"><img src="/images/icons/16/trackable_error.png" alt='Attention!' />This Trackable (<strong>Travel Bug Dog Tag</strong>) hasn't been activated. <a href="activate.aspx" title="Activate It Now">Activate it now</a>.</p></span>
+
+
+
+
+ <div class="Clear">
+ </div>
+ <p>
+ </p>
+
+ <div id="ctl00_ContentBody_SearchAgainPanel">
+
+ <div class="span-20">
+ <div class="InformationWidget">
+ <dl class="TrackableSearchForm">
+ <dt>
+ Enter the Tracking Code of the Item:</dt>
+ <dd>
+ <input name="ctl00$ContentBody$txtTrackingNumber" type="text" id="ctl00_ContentBody_txtTrackingNumber" maxlength="10" class="Text" />
+ <input type="submit" name="ctl00$ContentBody$btnLookupCode" value="Track" onclick="return false;" id="ctl00_ContentBody_btnLookupCode" />
+ </dd>
+ <dd>
+ <small><strong><em>
+ The 'Tracking Code' is the unique series of letters and numbers that appears on each item.
+ </em></strong></small>
+ </dd>
+ </dl>
+ </div>
+ </div>
+
+</div>
+
+ </div>
+ <div id="ctl00_divContentSide" class="span-4 last">
+ <div id="ctl00_uxBanManWidget" class="MasterPageAds" style="width:160px;">
+
+ <script type='text/javascript'>
+googletag.cmd.push(function() {{
+googletag.defineSlot('/1011121/trackables_pgs_160x600', [160, 600], 'div_5e86d8cd-24cd-4423-92b9-2cbc66470975').addService(googletag.pubads());
+googletag.pubads().enableSingleRequest();
+googletag.enableServices();
+}});
+</script>
+<div id='div_5e86d8cd-24cd-4423-92b9-2cbc66470975'>
+<script type='text/javascript'>
+googletag.cmd.push(function() { googletag.display('div_5e86d8cd-24cd-4423-92b9-2cbc66470975'); });
+</script>
+</div>
+
+ <p class="AlignCenter">
+ <small>
+ <a id="ctl00_hlAdvertiseWithUs" title="Advertising with Us" href="../about/advertising.aspx">Advertising with Us</a></small>
+ </p>
+
+</div>
+ </div>
+ </div>
+ </section>
+ <footer>
+ <div class="container">
+ <div class="span-24 last FooterTop">
+
+
+<div class="LocaleText">
+
+ <strong>Choose Your Language:</strong>
+
+</div>
+<div class="LocaleList">
+
+ <div class="selected-language">
+
+ <a href="#">English▼</a>
+
+ </div>
+ <ul class="language-list">
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl00_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl00$uxLocaleItem','')">English</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl01_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl01$uxLocaleItem','')">Deutsch</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl02_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl02$uxLocaleItem','')">Français</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl03_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl03$uxLocaleItem','')">Português</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl04_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl04$uxLocaleItem','')">Čeština</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl05_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl05$uxLocaleItem','')">Svenska</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl06_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl06$uxLocaleItem','')">Español</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl07_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl07$uxLocaleItem','')">Eesti</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl08_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl08$uxLocaleItem','')">Italiano</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl09_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl09$uxLocaleItem','')">Ελληνικά</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl10_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl10$uxLocaleItem','')">Latviešu</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl11_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl11$uxLocaleItem','')">Nederlands</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl12_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl12$uxLocaleItem','')">Català</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl13_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl13$uxLocaleItem','')">Polski</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl14_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl14$uxLocaleItem','')">Norsk, Bokmål</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl15_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl15$uxLocaleItem','')">한국어</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl16_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl16$uxLocaleItem','')">Magyar</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl17_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl17$uxLocaleItem','')">Română</a></li>
+
+ <li><a id="ctl00_uxLocaleList_uxLocaleList_ctl18_uxLocaleItem" href="javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl18$uxLocaleItem','')">日本語</a></li>
+
+ </ul>
+
+</div>
+<script type="text/javascript">
+
+ jQuery(document).ready(function () {
+ jQuery(".selected-language a").click(function (e) {
+ e.preventDefault();
+ var $loc = jQuery(this).parent().next();
+ jQuery($loc).show().position({
+ of: $loc.parent(),
+ my: "left top",
+ at: "left bottom",
+ offset: "0 0",
+ collision: "fit fit"
+ });
+ jQuery(this).addClass("Expanded");
+ jQuery(document).click(function () {
+ jQuery(".language-list").fadeOut("fast");
+ jQuery(".selected-language a").removeClass("Expanded");
+ });
+ return false;
+ });
+ });
+</script>
+ </div>
+ <div class="span-4">
+ <p class="FooterHeader">
+ <strong>
+ About</strong>
+ </p>
+ <ul class="FooterLinks">
+ <li>
+ <a id="ctl00_hlFooterGlossary" title="Glossary of Terms" href="../about/glossary.aspx">Glossary of Terms</a></li>
+ <li>
+ <a id="ctl00_hlFooterBrochures" title="Brochures" href="../tools/#Guide">Brochures</a></li>
+ <li>
+ <a id="ctl00_hlFooterAbout" title="About Groundspeak" href="../about/groundspeak.aspx">About Groundspeak</a></li>
+ <li>
+ <a id="ctl00_hlFooterVolunteers" title="About Our Volunteers" href="../volunteers/">About Our Volunteers</a></li>
+ <li>
+ <a id="ctl00_hlFooterHistory" title="History" href="../about/history.aspx">History</a></li>
+ </ul>
+ </div>
+ <div class="span-4">
+ <p class="FooterHeader">
+ <strong>
+ Press</strong>
+ </p>
+ <ul class="FooterLinks">
+ <li>
+ <a id="ctl00_hlFooterNews" title="News Articles" href="../press/">News Articles</a></li>
+ <li>
+ <a id="ctl00_hlFooterMediaFAQs" title="Media FAQs" rel="document" href="../articles/Brochures/footer/FAQ_Media.pdf">Media FAQs</a></li>
+ <li>
+ <a id="ctl00_hlFooterMediaInquiries" title="Media Inquiries" rel="external" href="http://support.groundspeak.com/index.php?pg=request&xCategory=11">Media Inquiries</a></li>
+ <li>
+ <a id="ctl00_hlFooterLogo" accesskey="l" title="Logo Usage Guidelines" href="../about/logousage.aspx">Logo Usage Guidelines</a></li>
+ </ul>
+ </div>
+ <div class="span-5">
+ <p class="FooterHeader">
+ <strong>
+ Questions & Suggestions</strong>
+ </p>
+ <ul class="FooterLinks">
+ <li>
+ <a id="ctl00_hlFooterHelpCenterLink" title="Help Center" rel="external" href="http://support.groundspeak.com/index.php">Help Center</a></li>
+ <li>
+ <a id="ctl00_hlFooterDiscussionForums" accesskey="f" title="Discussion Forums" href="../forums/">Discussion Forums</a></li>
+ <li>
+ <a id="ctl00_hlFooterParksPoliceLink" title="Land Management and Law Enforcement" href="../parksandpolice/">Land Management and Law Enforcement</a></li>
+ <li>
+ <a id="ctl00_hlFooterContactUs" title="Contact Us" href="../contact/">Contact Us</a></li>
+ </ul>
+ </div>
+ <div class="span-4">
+ <p class="FooterHeader">
+ <strong>
+ Resources</strong>
+ </p>
+ <ul class="FooterLinks">
+ <li>
+ <a id="ctl00_hlFooterTools" accesskey="o" title="Tools and Downloads" href="../tools/">Tools and Downloads</a></li>
+ <li>
+ <a id="ctl00_hlFooterAPIProgram" title="API Program" href="../live/">API Program</a></li>
+ <li>
+ <a id="ctl00_hlFooterBenchmarks" title="Find a Benchmark" href="../mark/">Find a Benchmark</a></li>
+ </ul>
+ </div>
+ <div class="span-4 append-3 last">
+ <p class="FooterHeader">
+ <strong>
+ Follow Us</strong>
+ </p>
+ <ul class="FooterLinks FollowUsLinks">
+ <li>
+ <a id="ctl00_hlFacebook" title="Facebook" href="http://www.facebook.com/geocaching"><img id="ctl00_imgFacebook" title="Facebook" src="../images/home/icon_facebook.png" alt="Facebook" style="border-width:0px;" /></a></li>
+ <li>
+ <a id="ctl00_hlTwitter" title="Twitter" href="http://twitter.com/GoGeocaching"><img id="ctl00_imgTwitter" title="Twitter" src="../images/twitter/twitter_icon_white_22.png" alt="Twitter" style="border-width:0px;" /></a></li>
+ <li>
+ <a id="ctl00_hlYouTube" title="YouTube" href="http://www.youtube.com/user/GoGeocaching"><img id="ctl00_imgYouTube" title="YouTube" src="../images/home/icon_youtube.png" alt="YouTube" style="border-width:0px;" /></a></li>
+ </ul>
+ </div>
+ <p class="span-24 last FooterBottom">
+ Copyright
+ © 2000-2013
+ <a href="http://www.groundspeak.com/" title="Groundspeak, Inc." accesskey="g">Groundspeak, Inc.</a>
+ All Rights Reserved.<br />
+ <a id="ctl00_hlFooterTerms" accesskey="u" title="Groundspeak Terms of Use" href="../about/termsofuse.aspx">Groundspeak Terms of Use</a> (Updated: May 14, 2013)
+ |
+ <a id="ctl00_hlFooterPrivacy" accesskey="x" title="Privacy Policy" href="../about/privacypolicy.aspx">Privacy Policy</a> (Updated: May 14, 2013)
+ </p>
+ </div>
+ </footer>
+ <div class="SkipLinks">
+ <a id="ctl00_hlSkipLinksTop" accesskey="t" title="Return to the Top of the Page" href="#Top">Return to the Top of the Page</a>
+ </div>
+
+<script type="text/javascript">
+//<![CDATA[
+var Page_ValidationSummaries = new Array(document.getElementById("ctl00_vsSignInWidgetForm"));
+var Page_Validators = new Array(document.getElementById("ctl00_rfvUsername"), document.getElementById("ctl00_rfvPassword"));
+//]]>
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+var ctl00_vsSignInWidgetForm = document.all ? document.all["ctl00_vsSignInWidgetForm"] : document.getElementById("ctl00_vsSignInWidgetForm");
+ctl00_vsSignInWidgetForm.headertext = "<h4>Please correct the following issues:</h4>";
+ctl00_vsSignInWidgetForm.validationGroup = "SignInForm";
+var ctl00_rfvUsername = document.all ? document.all["ctl00_rfvUsername"] : document.getElementById("ctl00_rfvUsername");
+ctl00_rfvUsername.controltovalidate = "ctl00_tbUsername";
+ctl00_rfvUsername.errormessage = "Username is a required field; please enter a valid username.";
+ctl00_rfvUsername.display = "Dynamic";
+ctl00_rfvUsername.validationGroup = "SignInForm";
+ctl00_rfvUsername.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
+ctl00_rfvUsername.initialvalue = "";
+var ctl00_rfvPassword = document.all ? document.all["ctl00_rfvPassword"] : document.getElementById("ctl00_rfvPassword");
+ctl00_rfvPassword.controltovalidate = "ctl00_tbPassword";
+ctl00_rfvPassword.errormessage = "Password is a required field; please enter a valid password.";
+ctl00_rfvPassword.display = "Dynamic";
+ctl00_rfvPassword.validationGroup = "SignInForm";
+ctl00_rfvPassword.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
+ctl00_rfvPassword.initialvalue = "";
+//]]>
+</script>
+
+
+<script type="text/javascript">
+//<![CDATA[
+var gaToken = 'UA-2020240-1';
+document.getElementById('ctl00_vsSignInWidgetForm').dispose = function() {
+ Array.remove(Page_ValidationSummaries, document.getElementById('ctl00_vsSignInWidgetForm'));
+}
+
+var Page_ValidationActive = false;
+if (typeof(ValidatorOnLoad) == "function") {
+ ValidatorOnLoad();
+}
+
+function ValidatorOnSubmit() {
+ if (Page_ValidationActive) {
+ return ValidatorCommonOnSubmit();
+ }
+ else {
+ return true;
+ }
+}
+ WebForm_AutoFocus('btnSignIn');
+document.getElementById('ctl00_rfvUsername').dispose = function() {
+ Array.remove(Page_Validators, document.getElementById('ctl00_rfvUsername'));
+}
+
+document.getElementById('ctl00_rfvPassword').dispose = function() {
+ Array.remove(Page_Validators, document.getElementById('ctl00_rfvPassword'));
+}
+//]]>
+</script>
+</form>
+ <script type="text/javascript">
+ var browserType = {
+ IE: !!(window.attachEvent && !window.opera),
+ Opera: !!window.opera,
+ WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
+ Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
+ MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
+ };
+
+ $(function () {
+ // Make the menu system play nice with all browsers:
+ $('ul.Menu li').hover(function () {
+ $(this).addClass('hover');
+ $('ul:first', this).css('visibility', 'visible');
+ }, function () {
+ $(this).removeClass('hover');
+ $('ul:first', this).css('visibility', 'hidden');
+ });
+ if (!isiOS()) {
+ // Constructing a Twitter-esque Login:
+ $(".SignInLink").click(function (e) {
+ e.preventDefault();
+ $("#SignInWidget").toggle();
+ $(".ProfileWidget").toggleClass("WidgetOpen");
+ $(this).blur();
+ $("#ctl00_tbUsername").focus();
+ });
+ $(".SignInCloseLink").click(function () {
+ $("#SignInWidget").toggle();
+ $(".ProfileWidget").toggleClass("WidgetOpen");
+ });
+ }
+ $('.SignedInProfileLink').truncate({
+ width: 120,
+ after: '&hellip;',
+ center: false,
+ addclass: false,
+ addtitle: false
+ });
+
+ // Hide the warning message if the user closed it already
+ if ($.cookie('hide_warning') != null) {
+ $(".WarningMessage").hide();
+ } else {
+ $("#warningCloseButton").click(function () {
+ $('.WarningMessage').hide('blind');
+ $.cookie('hide_warning', 'true', { expires: 1 });
+ });
+ }
+
+ function isiOS() {
+ return (
+ (navigator.userAgent.match(/(iPhone)|(iPod)|(iPad)/i))
+ );
+ }
+ });
+ </script>
+
+ <script type="text/javascript" language="javascript">
+ $(function () {
+ $("a.tb_images").fancybox({ 'titlePosition': 'inside' });
+ });
+
+ $("#ctl00_ContentBody_btnLookupCode").click(function() {
+ if ($("#ctl00_ContentBody_txtTrackingNumber").val().length > 0) {
+ window.location = "/track/details.aspx?tracker=" + $("#ctl00_ContentBody_txtTrackingNumber").val();
+ } else {
+ alert("Please enter a tracking code to search for...");
+ window.setTimeout(hideModalSpinner(), 50);
+ }
+ });
+ </script>
+
+ <script type="text/javascript">
+ _gaq.push(['_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js']);
+ _gaq.push(['_setAccount', gaToken]);
+ _gaq.push(['_trackPageview']);
+ (function () {
+ var ga = document.createElement('script');
+ ga.src = ('https:' == document.location.protocol ?
+ 'https://ssl' : 'http://www') +
+ '.google-analytics.com/ga.js';
+ ga.setAttribute('async', 'true');
+ document.documentElement.firstChild.appendChild(ga);
+ })();
+ $(function () {
+ $("a.language").click(function (e) {
+ e.preventDefault();
+ window.location.replace(window.location.href + (window.location.search.indexOf("?") == -1 ? "?" : "&") + "lang=" + $(this).attr("lang"));
+ });
+ });
+ </script>
+ <!-- Quantcast Tag -->
+ <div id="Quantcast">
+ <script type="text/javascript">
+ var _qevents = _qevents || [];
+
+ (function () {
+ var elem = document.createElement('script');
+
+ elem.src = (document.location.protocol == "https:" ? "https://secure" : "http://edge") + ".quantserve.com/quant.js";
+ elem.async = true;
+ elem.type = "text/javascript";
+ var scpt = document.getElementsByTagName('script')[0];
+ scpt.parentNode.insertBefore(elem, scpt);
+ })();
+ </script>
+ <script type="text/javascript">
+ _qevents.push({ qacct: "p-f6VPrfmR4cujU" });
+ </script>
+ <noscript>
+ <div style="display: none;">
+ <img src="http://pixel.quantserve.com/pixel/p-f6VPrfmR4cujU.gif" height="1" width="1"
+ alt="Quantcast" />
+ </div>
+ </noscript>
+ </div>
+ <!-- End Quantcast tag -->
+ <!-- Server: WEB15; Build: Web.HotFix_20130611.1 -->
+</body>
+</html>
diff --git a/tests/src/cgeo/geocaching/GeocacheTest.java b/tests/src/cgeo/geocaching/GeocacheTest.java index f3c9a65..affc793 100644 --- a/tests/src/cgeo/geocaching/GeocacheTest.java +++ b/tests/src/cgeo/geocaching/GeocacheTest.java @@ -1,10 +1,13 @@ package cgeo.geocaching; import cgeo.geocaching.enumerations.CacheType; +import cgeo.geocaching.geopoint.Geopoint; import android.test.AndroidTestCase; +import java.util.ArrayList; import java.util.Date; +import java.util.List; public class GeocacheTest extends AndroidTestCase { @@ -47,4 +50,30 @@ public class GeocacheTest extends AndroidTestCase { cache.setGeocode("gc1234"); assertEquals("GC1234", cache.getGeocode()); } + + public static void testUpdateWaypointFromNote() { + assertWaypointsParsed("Test N51 13.888 E007 03.444", 1); + } + + public static void testUpdateWaypointsFromNote() { + assertWaypointsParsed("Test N51 13.888 E007 03.444 Test N51 13.233 E007 03.444 Test N51 09.123 E007 03.444", 3); + } + + private static void assertWaypointsParsed(String note, int expectedWaypoints) { + Geocache cache = new Geocache(); + cache.setGeocode("Test"); + cache.setWaypoints(new ArrayList<Waypoint>(), false); + for (int i = 0; i < 2; i++) { + cache.setPersonalNote(note); + cache.parseWaypointsFromNote(); + final List<Waypoint> waypoints = cache.getWaypoints(); + assertNotNull(waypoints); + assertEquals(expectedWaypoints, waypoints.size()); + final Waypoint waypoint = waypoints.get(0); + assertEquals(new Geopoint("N51 13.888 E007 03.444"), waypoint.getCoords()); + // assertEquals("Test", waypoint.getNote()); + assertEquals(cgeoapplication.getInstance().getString(R.string.cache_personal_note) + " 1", waypoint.getName()); + cache.store(StoredList.TEMPORARY_LIST_ID, null); + } + } } diff --git a/tests/src/cgeo/geocaching/TrackableTest.java b/tests/src/cgeo/geocaching/TrackableTest.java index 2852a4d..7d3fd5c 100644 --- a/tests/src/cgeo/geocaching/TrackableTest.java +++ b/tests/src/cgeo/geocaching/TrackableTest.java @@ -5,8 +5,7 @@ import android.test.AndroidTestCase; public class TrackableTest extends AndroidTestCase { public static void testGetGeocode() { - final Trackable trackable = new Trackable(); - trackable.setGeocode("tb1234"); + final Trackable trackable = createTrackable("tb1234"); assertEquals("TB1234", trackable.getGeocode()); } @@ -15,4 +14,26 @@ public class TrackableTest extends AndroidTestCase { trackable.setLogs(null); assertNotNull("Trackable logs must not be null!", trackable.getLogs()); } + + public static void testTrackableUrl() { + final Trackable trackable = createTrackable("TB1234"); + assertEquals("http://www.geocaching.com//track/details.aspx?tracker=TB1234", trackable.getUrl()); + } + + public static void testGeokretUrl() { + Trackable geokret = createTrackable("GK82A2"); + assertEquals("http://geokrety.org/konkret.php?id=33442", geokret.getUrl()); + } + + public static void testLoggable() { + assertTrue(createTrackable("TB1234").isLoggable()); + assertFalse(createTrackable("GK1234").isLoggable()); + } + + private static Trackable createTrackable(String geocode) { + final Trackable trackable = new Trackable(); + trackable.setGeocode(geocode); + return trackable; + } + } diff --git a/tests/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactoryTest.java b/tests/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactoryTest.java new file mode 100644 index 0000000..2d510ab --- /dev/null +++ b/tests/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactoryTest.java @@ -0,0 +1,19 @@ +package cgeo.geocaching.apps.cache.navi; + +import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum; + +import java.util.HashSet; + +import junit.framework.TestCase; + +public class NavigationAppFactoryTest extends TestCase { + + public static void testUniqueNavigationAppIds() throws Exception { + final HashSet<Integer> idSet = new HashSet<Integer>(); + for (NavigationAppsEnum navigationApp : NavigationAppsEnum.values()) { + idSet.add(navigationApp.id); + } + assertEquals("Duplicate id in " + NavigationAppsEnum.class.getSimpleName(), NavigationAppsEnum.values().length, idSet.size()); + } + +} diff --git a/tests/src/cgeo/geocaching/cgDataTest.java b/tests/src/cgeo/geocaching/cgDataTest.java index a6fb846..ce825f6 100644 --- a/tests/src/cgeo/geocaching/cgDataTest.java +++ b/tests/src/cgeo/geocaching/cgDataTest.java @@ -131,4 +131,15 @@ public class cgDataTest extends CGeoTestCase { assertNotNull("Logs must not be null", logs); assertEquals("Logs from empty geocode must be empty", 0, logs.size()); } + + public static void testLoadCacheHistory() { + int sumCaches = 0; + for (CacheType cacheType : CacheType.values()) { + SearchResult historyOfType = cgData.getHistoryOfCaches(false, cacheType); + assertNotNull(historyOfType); + sumCaches += historyOfType.getCount(); + } + // check that two different routines behave the same + assertEquals(cgData.getAllHistoryCachesCount(), sumCaches); + } } diff --git a/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java b/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java index 94cc067..8d3d840 100644 --- a/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java +++ b/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java @@ -3,6 +3,7 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Settings; import cgeo.geocaching.connector.ConnectorFactory; +import cgeo.geocaching.connector.trackable.TravelBugConnector; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; @@ -46,10 +47,16 @@ public class GCConnectorTest extends AbstractResourceInstrumentationTestCase { public static void testCanHandle() { assertTrue(GCConnector.getInstance().canHandle("GC2MEGA")); - assertTrue(GCConnector.getInstance().canHandle("TB3F651")); assertFalse(GCConnector.getInstance().canHandle("OXZZZZZ")); } + /** + * functionality moved to {@link TravelBugConnector} + */ + public static void testCanNotHandleTrackablesAnymore() { + assertFalse(GCConnector.getInstance().canHandle("TB3F651")); + } + public static void testBaseCodings() { assertEquals(2045702, GCConstants.gccodeToGCId("GC2MEGA")); } diff --git a/tests/src/cgeo/geocaching/connector/gc/GCConstantsTest.java b/tests/src/cgeo/geocaching/connector/gc/GCConstantsTest.java index 4458789..2bec912 100644 --- a/tests/src/cgeo/geocaching/connector/gc/GCConstantsTest.java +++ b/tests/src/cgeo/geocaching/connector/gc/GCConstantsTest.java @@ -1,7 +1,7 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.test.mock.MockedCache; -import cgeo.geocaching.utils.BaseUtils; +import cgeo.geocaching.utils.TextUtils; import android.test.AndroidTestCase; import android.text.Html; @@ -20,7 +20,7 @@ public class GCConstantsTest extends AndroidTestCase { } private static String parseLocation(final String html) { - return BaseUtils.getMatch(html, GCConstants.PATTERN_LOCATION, true, ""); + return TextUtils.getMatch(html, GCConstants.PATTERN_LOCATION, true, ""); } public static void testCacheCount() { @@ -31,7 +31,7 @@ public class GCConstantsTest extends AndroidTestCase { private static void assertCacheCount(final int count, final String html) { try { - assertEquals(count, Integer.parseInt(BaseUtils.getMatch(html, GCConstants.PATTERN_CACHES_FOUND, true, "0").replaceAll("[,.]", ""))); + assertEquals(count, Integer.parseInt(TextUtils.getMatch(html, GCConstants.PATTERN_CACHES_FOUND, true, "0").replaceAll("[,.]", ""))); } catch (NumberFormatException e) { fail(); } @@ -53,12 +53,12 @@ public class GCConstantsTest extends AndroidTestCase { public static void testConstants() { final String session = "userSession = new Groundspeak.Map.UserSession('aKWZ', userOptions:'XPTf', sessionToken:'123pNKwdktYGZL0xd-I7yqA6nm_JE1BDUtM4KcOkifin2TRCMutBd_PZE14Ohpffs2ZgkTnxTSnxYpBigK4hBA2', subscriberType: 3, enablePersonalization: true });"; - assertEquals("aKWZ", BaseUtils.getMatch(session, GCConstants.PATTERN_USERSESSION, "")); - assertTrue(BaseUtils.getMatch(session, GCConstants.PATTERN_SESSIONTOKEN, "").startsWith("123pNK")); + assertEquals("aKWZ", TextUtils.getMatch(session, GCConstants.PATTERN_USERSESSION, "")); + assertTrue(TextUtils.getMatch(session, GCConstants.PATTERN_SESSIONTOKEN, "").startsWith("123pNK")); } public static void testTBWithSpecialChar() { final String page = "<meta name=\"og:site_name\" content=\"Geocaching.com\" property=\"og:site_name\" /><meta name=\"og:type\" content=\"article\" property=\"og:type\" /><meta name=\"fb:app_id\" content=\"100167303362705\" property=\"fb:app_id\" /><meta name=\"og:url\" content=\"http://coord.info/TB4VPZD\" property=\"og:url\" /><meta name=\"og:description\" property=\"og:description\" /><meta name=\"og:image\" content=\"http://www.geocaching.com/images/facebook/wpttypes/24.png\" property=\"og:image\" /><meta name=\"og:title\" content=\"Schlauchen&ravestorm\" property=\"og:title\" /></head>\n"; - assertEquals("Schlauchen&ravestorm", Html.fromHtml(BaseUtils.getMatch(page, GCConstants.PATTERN_TRACKABLE_NAME, "")).toString()); + assertEquals("Schlauchen&ravestorm", Html.fromHtml(TextUtils.getMatch(page, GCConstants.PATTERN_TRACKABLE_NAME, "")).toString()); } } diff --git a/tests/src/cgeo/geocaching/connector/gc/GCParserTest.java b/tests/src/cgeo/geocaching/connector/gc/GCParserTest.java index 9bc2caf..45eee3b 100644 --- a/tests/src/cgeo/geocaching/connector/gc/GCParserTest.java +++ b/tests/src/cgeo/geocaching/connector/gc/GCParserTest.java @@ -4,7 +4,9 @@ import cgeo.geocaching.Geocache; import cgeo.geocaching.Image; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Settings; +import cgeo.geocaching.Trackable; import cgeo.geocaching.Waypoint; +import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.enumerations.WaypointType; @@ -213,4 +215,12 @@ public class GCParserTest extends AbstractResourceInstrumentationTestCase { return result.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_OR_DB); } + public void testTrackableNotActivated() { + final String page = getFileContent(R.raw.tb123e_html); + final Trackable trackable = GCParser.parseTrackable(page, "TB123E"); + assertNotNull(trackable); + assertEquals("TB123E", trackable.getGeocode()); + final String expectedDetails = cgeoapplication.getInstance().getString(cgeo.geocaching.R.string.trackable_not_activated); + assertEquals(expectedDetails, trackable.getDetails()); + } } diff --git a/tests/src/cgeo/geocaching/connector/gc/TrackablesTest.java b/tests/src/cgeo/geocaching/connector/gc/TrackablesTest.java index cd130db..4f13a7a 100644 --- a/tests/src/cgeo/geocaching/connector/gc/TrackablesTest.java +++ b/tests/src/cgeo/geocaching/connector/gc/TrackablesTest.java @@ -7,7 +7,7 @@ import cgeo.geocaching.Trackable; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.test.AbstractResourceInstrumentationTestCase; import cgeo.geocaching.test.R; -import cgeo.geocaching.utils.BaseUtils; +import cgeo.geocaching.utils.TextUtils; import java.util.List; @@ -96,7 +96,7 @@ public class TrackablesTest extends AbstractResourceInstrumentationTestCase { private Trackable parseTrackable(int trackablePage) { final String pageContent = getFileContent(trackablePage); - return GCParser.parseTrackable(BaseUtils.replaceWhitespace(pageContent), null); + return GCParser.parseTrackable(TextUtils.replaceWhitespace(pageContent), null); } public void testParseMarkMissing() { diff --git a/tests/src/cgeo/geocaching/connector/trackable/GeokretyConnectorTest.java b/tests/src/cgeo/geocaching/connector/trackable/GeokretyConnectorTest.java new file mode 100644 index 0000000..f08fb6b --- /dev/null +++ b/tests/src/cgeo/geocaching/connector/trackable/GeokretyConnectorTest.java @@ -0,0 +1,14 @@ +package cgeo.geocaching.connector.trackable; + +import junit.framework.TestCase; + +public class GeokretyConnectorTest extends TestCase { + + public static void testCanHandleTrackable() { + assertTrue(new GeokretyConnector().canHandleTrackable("GK82A2")); + assertFalse(new GeokretyConnector().canHandleTrackable("GKXYZ1")); // non hex + assertFalse(new GeokretyConnector().canHandleTrackable("TB1234")); + assertFalse(new GeokretyConnector().canHandleTrackable("UNKNOWN")); + } + +} diff --git a/tests/src/cgeo/geocaching/connector/trackable/GeokretyParserTest.java b/tests/src/cgeo/geocaching/connector/trackable/GeokretyParserTest.java new file mode 100644 index 0000000..3915993 --- /dev/null +++ b/tests/src/cgeo/geocaching/connector/trackable/GeokretyParserTest.java @@ -0,0 +1,19 @@ +package cgeo.geocaching.connector.trackable; + +import cgeo.geocaching.Trackable; +import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.test.AbstractResourceInstrumentationTestCase; +import cgeo.geocaching.test.R; + +public class GeokretyParserTest extends AbstractResourceInstrumentationTestCase { + + public void testParse() { + Trackable trackable = GeokretyParser.parse(getFileContent(R.raw.geokret141_xml)); + assertNotNull(trackable); + assertEquals("WeltenbummlerKret", trackable.getName()); + assertEquals("GK008D", trackable.getGeocode()); + assertEquals(2235f, trackable.getDistance()); + assertEquals(cgeoapplication.getInstance().getString(cgeo.geocaching.R.string.geokret_type_traditional), trackable.getType()); + } + +} diff --git a/tests/src/cgeo/geocaching/connector/trackable/TravelBugConnectorTest.java b/tests/src/cgeo/geocaching/connector/trackable/TravelBugConnectorTest.java new file mode 100644 index 0000000..ef2821d --- /dev/null +++ b/tests/src/cgeo/geocaching/connector/trackable/TravelBugConnectorTest.java @@ -0,0 +1,41 @@ +package cgeo.geocaching.connector.trackable; + +import cgeo.geocaching.Trackable; + +import junit.framework.TestCase; + +public class TravelBugConnectorTest extends TestCase { + + public static void testCanHandleTrackable() { + assertTrue(getConnector().canHandleTrackable("TB1234")); + assertTrue(getConnector().canHandleTrackable("TB1")); + assertTrue(getConnector().canHandleTrackable("TB123F")); + assertTrue(getConnector().canHandleTrackable("TB123Z")); + assertTrue(getConnector().canHandleTrackable("TB4JD36")); // existing TB, 5 specific characters + assertTrue(getConnector().canHandleTrackable("GK1234")); // valid secret code, even though this might be a geokrety + assertTrue(getConnector().canHandleTrackable("GST9HV")); // existing secret code + assertFalse(getConnector().canHandleTrackable("UNKNOWN")); + } + + public static void testGetUrl() { + final Trackable trackable = new Trackable(); + trackable.setGeocode("TB2345"); + assertEquals("http://www.geocaching.com//track/details.aspx?tracker=TB2345", getConnector().getUrl(trackable)); + } + + public static void testOnlineSearchBySecretCode() { + Trackable trackable = getConnector().searchTrackable("GST9HV", null, null); + assertNotNull(trackable); + assertEquals("Deutschland", trackable.getName()); + } + + public static void testOnlineSearchByPublicCode() { + Trackable trackable = getConnector().searchTrackable("TB4JD36", null, null); + assertNotNull(trackable); + assertEquals("Mein Kilometerzähler", trackable.getName()); + } + + private static TravelBugConnector getConnector() { + return TravelBugConnector.getInstance(); + } +} diff --git a/tests/src/cgeo/geocaching/export/GpxSerializerTest.java b/tests/src/cgeo/geocaching/export/GpxSerializerTest.java new file mode 100644 index 0000000..0080b76 --- /dev/null +++ b/tests/src/cgeo/geocaching/export/GpxSerializerTest.java @@ -0,0 +1,37 @@ +package cgeo.geocaching.export; + +import cgeo.geocaching.Geocache; +import cgeo.geocaching.files.ParserException; +import cgeo.geocaching.test.AbstractResourceInstrumentationTestCase; +import cgeo.geocaching.test.R; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicReference; + +public class GpxSerializerTest extends AbstractResourceInstrumentationTestCase { + + public static void testWriteEmptyGPX() throws Exception { + final StringWriter writer = new StringWriter(); + new GpxSerializer().writeGPX(Collections.<String> emptyList(), writer, null); + assertEquals("<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><gpx version=\"1.0\" creator=\"c:geo - http://www.cgeo.org/\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0 http://www.groundspeak.com/cache/1/0/1/cache.xsd\" xmlns=\"http://www.topografix.com/GPX/1/0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:groundspeak=\"http://www.groundspeak.com/cache/1/0\" />", writer.getBuffer().toString()); + } + + public void testProgressReporting() throws IOException, ParserException { + final AtomicReference<Integer> importedCount = new AtomicReference<Integer>(0); + final StringWriter writer = new StringWriter(); + + Geocache cache = loadCacheFromResource(R.raw.gc1bkp3_gpx101); + assertNotNull(cache); + + new GpxSerializer().writeGPX(Collections.singletonList("GC1BKP3"), writer, new GpxSerializer.ProgressListener() { + + @Override + public void publishProgress(int countExported) { + importedCount.set(countExported); + } + }); + assertEquals("Progress listener not called", 1, importedCount.get().intValue()); + } +} diff --git a/tests/src/cgeo/geocaching/speech/TextFactoryTest.java b/tests/src/cgeo/geocaching/speech/TextFactoryTest.java new file mode 100644 index 0000000..7e237a1 --- /dev/null +++ b/tests/src/cgeo/geocaching/speech/TextFactoryTest.java @@ -0,0 +1,157 @@ +package cgeo.geocaching.speech; + +import cgeo.geocaching.Settings; +import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.geopoint.Geopoint; + +import android.content.res.Configuration; +import android.content.res.Resources; +import android.test.AndroidTestCase; + +import java.util.Locale; + +public class TextFactoryTest extends AndroidTestCase { + + private static final Geopoint MY_POSITION = new Geopoint(15, -86); + private static final Geopoint NORTH_6100M = new Geopoint(15.054859, -86); + private static final Geopoint WEST_1MILE = new Geopoint(15, -86.014984); + private static final Geopoint SOUTH_1020M = new Geopoint(14.990827, -86); + private static final Geopoint EAST_123M = new Geopoint(15, -85.998855); + private static final Geopoint WEST_34M = new Geopoint(15, -86.000317); + private static final Geopoint EAST_1M = new Geopoint(15, -85.999990); + private static final Geopoint EAST_1FT = new Geopoint(15, -85.999996); + + private Locale defaultLocale1; + private Locale defaultLocale2; + private boolean defaultMetric; + + @Override + protected void setUp() throws Exception { + super.setUp(); + final Resources resources = cgeoapplication.getInstance().getResources(); + final Configuration config = resources.getConfiguration(); + defaultLocale1 = config.locale; + defaultLocale2 = Locale.getDefault(); + defaultMetric = Settings.isUseMetricUnits(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + setLocale(defaultLocale1, defaultLocale2, defaultMetric); + } + + public static void testGetTextEn() { + setLocale(Locale.UK, true); + assertEquals("one o'clock. 6 kilometers", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 o'clock. 1.6 kilometers", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("6 o'clock. one kilometer", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("3 o'clock. 120 meters", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("11 o'clock. 34 meters", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("9 o'clock. one meter", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("12 o'clock. 0 meters", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + + setLocale(Locale.UK, false); + assertEquals("one o'clock. 4 miles", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 o'clock. one mile", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("6 o'clock. 0.6 miles", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("3 o'clock. 400 feet", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("11 o'clock. 111 feet", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("9 o'clock. one foot", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("12 o'clock. 0 feet", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + } + + public static void testGetTextDe() { + setLocale(Locale.GERMANY, true); + assertEquals("ein Uhr. 6 Kilometer", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 Uhr. 1,6 Kilometer", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("6 Uhr. ein Kilometer", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("3 Uhr. 120 Meter", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("11 Uhr. 34 Meter", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("9 Uhr. ein Meter", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("12 Uhr. 0 Meter", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + + setLocale(Locale.GERMANY, false); + assertEquals("ein Uhr. 4 Meilen", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 Uhr. eine Meile", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("6 Uhr. 0,6 Meilen", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("3 Uhr. 400 Fuß", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("11 Uhr. 111 Fuß", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("9 Uhr. ein Fuß", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("12 Uhr. 0 Fuß", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + } + + public static void testGetTextFr() { + setLocale(Locale.FRANCE, true); + assertEquals("une heure. 6 kilomètres", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 heures. 1,6 kilomètres", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("6 heures. un kilomètre", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("3 heures. 120 mètres", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("11 heures. 34 mètres", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("9 heures. un mètre", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("12 heures. 0 mètre", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + + setLocale(Locale.FRANCE, false); + assertEquals("une heure. 4 milles", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 heures. un mille", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("6 heures. 0,6 milles", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("3 heures. 400 pieds", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("11 heures. 111 pieds", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("9 heures. un pied", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("12 heures. 0 pied", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + } + + public static void testGetTextIt() { + setLocale(Locale.ITALY, true); + assertEquals("a ore una. 6 chilometri", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("a ore 9. 1,6 chilometri", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("a ore 6. uno chilometro", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("a ore 3. 120 metri", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("a ore 11. 34 metri", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("a ore 9. uno metro", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("a ore 12. 0 metri", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + + setLocale(Locale.ITALY, false); + assertEquals("a ore una. 4 miglia", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("a ore 9. uno miglio", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("a ore 6. 0,6 miglia", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("a ore 3. 400 piedi", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("a ore 11. 111 piedi", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("a ore 9. uno piede", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("a ore 12. 0 piedi", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + } + + public static void testGetTextSv() { + setLocale(new Locale("sv", "SE"), true); + assertEquals("Klockan ett. 6 kilometer", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("Klockan 9. 1,6 kilometer", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("Klockan 6. en kilometer", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("Klockan 3. 120 meter", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("Klockan 11. 34 meter", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("Klockan 9. en meter", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("Klockan 12. 0 meter", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + + setLocale(new Locale("sv", "SE"), false); + assertEquals("Klockan ett. 4 engelsk mil", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("Klockan 9. en engelsk mil", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("Klockan 6. 0,6 engelsk mil", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("Klockan 3. 400 fot", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("Klockan 11. 111 fot", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("Klockan 9. en fot", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("Klockan 12. 0 fot", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + } + + private static void setLocale(Locale locale, boolean metric) { + setLocale(locale, locale, metric); + } + + private static void setLocale(Locale locale1, Locale locale2, boolean metric) { + final Configuration config = new Configuration(); + config.locale = locale1; + final Resources resources = cgeoapplication.getInstance().getResources(); + resources.updateConfiguration(config, resources.getDisplayMetrics()); + + Locale.setDefault(locale2); + Settings.setUseMetricUnits(metric); + } +} diff --git a/tests/src/cgeo/geocaching/test/AbstractResourceInstrumentationTestCase.java b/tests/src/cgeo/geocaching/test/AbstractResourceInstrumentationTestCase.java index 304f98d..cb8238f 100644 --- a/tests/src/cgeo/geocaching/test/AbstractResourceInstrumentationTestCase.java +++ b/tests/src/cgeo/geocaching/test/AbstractResourceInstrumentationTestCase.java @@ -1,11 +1,14 @@ package cgeo.geocaching.test; +import cgeo.geocaching.Geocache; import cgeo.geocaching.SearchResult; import cgeo.geocaching.StoredList; import cgeo.geocaching.cgData; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.enumerations.LoadFlags.RemoveFlag; +import cgeo.geocaching.files.GPX10Parser; +import cgeo.geocaching.files.ParserException; import android.content.res.Resources; import android.test.InstrumentationTestCase; @@ -14,6 +17,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Collection; import java.util.EnumSet; import java.util.Scanner; @@ -78,4 +82,17 @@ public abstract class AbstractResourceInstrumentationTestCase extends Instrument protected final int getTemporaryListId() { return temporaryListId; } + + final protected Geocache loadCacheFromResource(int resourceId) throws IOException, ParserException { + final InputStream instream = getResourceStream(resourceId); + try { + GPX10Parser parser = new GPX10Parser(StoredList.TEMPORARY_LIST_ID); + Collection<Geocache> caches = parser.parse(instream, null); + assertNotNull(caches); + assertFalse(caches.isEmpty()); + return caches.iterator().next(); + } finally { + instream.close(); + } + } } diff --git a/tests/src/cgeo/geocaching/test/RegExPerformanceTest.java b/tests/src/cgeo/geocaching/test/RegExPerformanceTest.java index d71f489..03ca18f 100644 --- a/tests/src/cgeo/geocaching/test/RegExPerformanceTest.java +++ b/tests/src/cgeo/geocaching/test/RegExPerformanceTest.java @@ -5,7 +5,7 @@ import cgeo.geocaching.test.mock.GC2CJPF; import cgeo.geocaching.test.mock.GC2JVEH; import cgeo.geocaching.test.mock.GC3XX5J; import cgeo.geocaching.test.mock.MockedCache; -import cgeo.geocaching.utils.BaseUtils; +import cgeo.geocaching.utils.TextUtils; import java.util.ArrayList; import java.util.Arrays; @@ -98,8 +98,8 @@ public class RegExPerformanceTest extends TestCase { for (MockedCache cache : MOCKED_CACHES) { String page = cache.getData(); - String result1 = BaseUtils.getMatch(page, p1, true, ""); - String result2 = BaseUtils.getMatch(page, p2, true, ""); + String result1 = TextUtils.getMatch(page, p1, true, ""); + String result2 = TextUtils.getMatch(page, p2, true, ""); assertEquals(result1, result2); long diff1, diff2; @@ -123,7 +123,7 @@ public class RegExPerformanceTest extends TestCase { private static long parse(String page, Pattern pattern, int iterations) { final long start = System.currentTimeMillis(); for (int j = 0; j < iterations; j++) { - BaseUtils.getMatch(page, pattern, true, ""); + TextUtils.getMatch(page, pattern, true, ""); } return System.currentTimeMillis() - start; diff --git a/tests/src/cgeo/geocaching/test/WhitespaceTest.java b/tests/src/cgeo/geocaching/test/WhitespaceTest.java index 5e792d9..125a0cb 100644 --- a/tests/src/cgeo/geocaching/test/WhitespaceTest.java +++ b/tests/src/cgeo/geocaching/test/WhitespaceTest.java @@ -1,6 +1,6 @@ package cgeo.geocaching.test; -import cgeo.geocaching.utils.BaseUtils; +import cgeo.geocaching.utils.TextUtils; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; @@ -76,7 +76,7 @@ public class WhitespaceTest extends AbstractResourceInstrumentationTestCase { public void testActualImplementation() { final String result; final long start = System.currentTimeMillis(); - result = BaseUtils.replaceWhitespace(data); + result = TextUtils.replaceWhitespace(data); final long end = System.currentTimeMillis(); assertEquals(EXPECTED_SIZE, result.length()); Log.d((end - start) + " ms actual implementation"); diff --git a/tests/src/cgeo/geocaching/test/mock/MockedCache.java b/tests/src/cgeo/geocaching/test/mock/MockedCache.java index 7ad566a..0085a18 100644 --- a/tests/src/cgeo/geocaching/test/mock/MockedCache.java +++ b/tests/src/cgeo/geocaching/test/mock/MockedCache.java @@ -5,7 +5,7 @@ import cgeo.geocaching.Image; import cgeo.geocaching.Trackable; import cgeo.geocaching.connector.gc.GCConstants; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.utils.BaseUtils; +import cgeo.geocaching.utils.TextUtils; import org.apache.commons.lang3.StringUtils; import org.mapsforge.core.IOUtils; @@ -28,7 +28,7 @@ public abstract class MockedCache implements ICache { this.coords = coords; this.data = MockedCache.readCachePage(getGeocode()); // for mocked caches the user logged in is the user who saved the html file(s) - this.mockedDataUser = BaseUtils.getMatch(data, GCConstants.PATTERN_LOGIN_NAME, true, ""); + this.mockedDataUser = TextUtils.getMatch(data, GCConstants.PATTERN_LOGIN_NAME, true, ""); } public String getMockedDataUser() { @@ -68,7 +68,7 @@ public abstract class MockedCache implements ICache { buffer.append(line).append('\n'); } - return BaseUtils.replaceWhitespace(buffer.toString()); + return TextUtils.replaceWhitespace(buffer.toString()); } catch (IOException e) { Assert.fail(e.getMessage()); } finally { diff --git a/tests/src/cgeo/geocaching/utils/ProcessUtilsTest.java b/tests/src/cgeo/geocaching/utils/ProcessUtilsTest.java new file mode 100644 index 0000000..f34faa6 --- /dev/null +++ b/tests/src/cgeo/geocaching/utils/ProcessUtilsTest.java @@ -0,0 +1,21 @@ +package cgeo.geocaching.utils; + +import junit.framework.TestCase; + +public class ProcessUtilsTest extends TestCase { + + public static void testIsInstalled() { + assertTrue(ProcessUtils.isInstalled("com.android.launcher")); + } + + public static void testIsInstalledNotLaunchable() { + final String packageName = "com.android.systemui"; + assertTrue(ProcessUtils.isInstalled(packageName)); + assertFalse(ProcessUtils.isLaunchable(packageName)); + } + + public static void testIsLaunchable() { + assertTrue(ProcessUtils.isInstalled("com.android.settings")); + } + +} diff --git a/tests/src/cgeo/geocaching/utils/BaseUtilsTest.java b/tests/src/cgeo/geocaching/utils/TextUtilsTest.java index 78a833c..2093383 100644 --- a/tests/src/cgeo/geocaching/utils/BaseUtilsTest.java +++ b/tests/src/cgeo/geocaching/utils/TextUtilsTest.java @@ -8,20 +8,20 @@ import android.test.AndroidTestCase; import java.util.regex.Pattern; -public class BaseUtilsTest extends AndroidTestCase { +public class TextUtilsTest extends AndroidTestCase { public static void testRegEx() { final String page = MockedCache.readCachePage("GC2CJPF"); - assertEquals(GCConstantsTest.MOCK_LOGIN_NAME, BaseUtils.getMatch(page, GCConstants.PATTERN_LOGIN_NAME, true, "???")); - assertTrue(page.contains("id=\"ctl00_hlRenew\"") || GCConstants.MEMBER_STATUS_PM.equals(BaseUtils.getMatch(page, GCConstants.PATTERN_MEMBER_STATUS, true, "???"))); + assertEquals(GCConstantsTest.MOCK_LOGIN_NAME, TextUtils.getMatch(page, GCConstants.PATTERN_LOGIN_NAME, true, "???")); + assertTrue(page.contains("id=\"ctl00_hlRenew\"") || GCConstants.MEMBER_STATUS_PM.equals(TextUtils.getMatch(page, GCConstants.PATTERN_MEMBER_STATUS, true, "???"))); } public static void testReplaceWhitespaces() { - assertEquals("foo bar baz ", BaseUtils.replaceWhitespace(" foo\n\tbar \r baz ")); + assertEquals("foo bar baz ", TextUtils.replaceWhitespace(" foo\n\tbar \r baz ")); } public static void testControlCharactersCleanup() { final Pattern patternAll = Pattern.compile("(.*)", Pattern.DOTALL); - assertEquals("some control characters removed", BaseUtils.getMatch("some" + "\u001C" + "control" + (char) 0x1D + "characters removed", patternAll, "")); - assertEquals("newline also removed", BaseUtils.getMatch("newline\nalso\nremoved", patternAll, "")); + assertEquals("some control characters removed", TextUtils.getMatch("some" + "\u001C" + "control" + (char) 0x1D + "characters removed", patternAll, "")); + assertEquals("newline also removed", TextUtils.getMatch("newline\nalso\nremoved", patternAll, "")); } } |
