reference_resolver_test.py revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1#!/usr/bin/env python
2# Copyright (c) 2012 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import json
7import os
8import sys
9import unittest
10
11from file_system import FileNotFoundError
12from in_memory_object_store import InMemoryObjectStore
13from reference_resolver import ReferenceResolver
14
15class FakeAPIDataSource(object):
16  def __init__(self, json_data):
17    self._json = json_data
18
19  def get(self, key):
20    if key not in self._json:
21      raise FileNotFoundError(key)
22    return self._json[key]
23
24  def GetAllNames(self):
25    return self._json.keys()
26
27class APIDataSourceTest(unittest.TestCase):
28  def setUp(self):
29    self._base_path = os.path.join(sys.path[0], 'test_data', 'test_json')
30
31  def _ReadLocalFile(self, filename):
32    with open(os.path.join(self._base_path, filename), 'r') as f:
33      return f.read()
34
35  def testGetLink(self):
36    data_source = FakeAPIDataSource(
37        json.loads(self._ReadLocalFile('fake_data_source.json')))
38    resolver = ReferenceResolver(data_source,
39                                 data_source,
40                                 InMemoryObjectStore(''))
41    self.assertEqual({
42      'href': 'foo.html',
43      'text': 'foo',
44      'name': 'foo'
45    }, resolver.GetLink('foo', namespace='baz'))
46    self.assertEqual({
47      'href': 'foo.html#type-foo_t1',
48      'text': 'foo.foo_t1',
49      'name': 'foo_t1'
50    }, resolver.GetLink('foo.foo_t1', namespace='baz'))
51    self.assertEqual({
52      'href': 'baz.html#event-baz_e1',
53      'text': 'baz_e1',
54      'name': 'baz_e1'
55    }, resolver.GetLink('baz.baz_e1', namespace='baz'))
56    self.assertEqual({
57      'href': 'baz.html#event-baz_e1',
58      'text': 'baz_e1',
59      'name': 'baz_e1'
60    }, resolver.GetLink('baz_e1', namespace='baz'))
61    self.assertEqual({
62      'href': 'foo.html#method-foo_f1',
63      'text': 'foo.foo_f1',
64      'name': 'foo_f1'
65    }, resolver.GetLink('foo.foo_f1', namespace='baz'))
66    self.assertEqual({
67      'href': 'foo.html#property-foo_p3',
68      'text': 'foo.foo_p3',
69      'name': 'foo_p3'
70    }, resolver.GetLink('foo.foo_p3', namespace='baz'))
71    self.assertEqual({
72      'href': 'bar.bon.html#type-bar_bon_t3',
73      'text': 'bar.bon.bar_bon_t3',
74      'name': 'bar_bon_t3'
75    }, resolver.GetLink('bar.bon.bar_bon_t3', namespace='baz'))
76    self.assertEqual({
77      'href': 'bar.bon.html#property-bar_bon_p3',
78      'text': 'bar_bon_p3',
79      'name': 'bar_bon_p3'
80    }, resolver.GetLink('bar_bon_p3', namespace='bar.bon'))
81    self.assertEqual({
82      'href': 'bar.bon.html#property-bar_bon_p3',
83      'text': 'bar_bon_p3',
84      'name': 'bar_bon_p3'
85    }, resolver.GetLink('bar.bon.bar_bon_p3', namespace='bar.bon'))
86    self.assertEqual({
87      'href': 'bar.html#event-bar_e2',
88      'text': 'bar_e2',
89      'name': 'bar_e2'
90    }, resolver.GetLink('bar.bar_e2', namespace='bar'))
91    self.assertEqual({
92      'href': 'bar.html#type-bon',
93      'text': 'bon',
94      'name': 'bon'
95    }, resolver.GetLink('bar.bon', namespace='bar'))
96    self.assertEqual({
97      'href': 'foo.html#event-foo_t3-foo_t3_e1',
98      'text': 'foo_t3.foo_t3_e1',
99      'name': 'foo_t3_e1'
100    }, resolver.GetLink('foo_t3.foo_t3_e1', namespace='foo'))
101    self.assertEqual({
102      'href': 'foo.html#event-foo_t3-foo_t3_e1',
103      'text': 'foo_t3.foo_t3_e1',
104      'name': 'foo_t3_e1'
105    }, resolver.GetLink('foo.foo_t3.foo_t3_e1', namespace='foo'))
106    self.assertEqual({
107      'href': 'foo.html#event-foo_t3-foo_t3_e1',
108      'text': 'foo_t3.foo_t3_e1',
109      'name': 'foo_t3_e1'
110    }, resolver.GetLink('foo.foo_p1.foo_t3_e1', namespace='foo'))
111    self.assertEqual({
112      'href': 'bar.html#property-bar_t1-bar_t1_p1',
113      'text': 'bar.bar_t1.bar_t1_p1',
114      'name': 'bar_t1_p1'
115    }, resolver.GetLink('bar.bar_p3.bar_t1_p1', namespace='foo'))
116    self.assertEqual({
117      'href': 'bar.html#property-bar_t1-bar_t1_p1',
118      'text': 'bar_t1.bar_t1_p1',
119      'name': 'bar_t1_p1'
120    }, resolver.GetLink('bar_p3.bar_t1_p1', namespace='bar'))
121    self.assertEqual(
122        None,
123        resolver.GetLink('bar.bar_p3.bar_t2_p1', namespace='bar'))
124    self.assertEqual(
125        None,
126        resolver.GetLink('bar.bon.bar_e3', namespace='bar'))
127    self.assertEqual(
128        None,
129        resolver.GetLink('bar_p3', namespace='baz.bon'))
130    self.assertEqual(
131        None,
132        resolver.GetLink('falafel.faf', namespace='a'))
133    self.assertEqual(
134        None,
135        resolver.GetLink('bar_p3', namespace='foo'))
136    self.assertEqual(
137        'Hello <a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>, '
138            '<a href="bar.bon.html#property-bar_bon_p3">Bon Bon</a>, '
139            '<a href="bar.bon.html#property-bar_bon_p3">bar_bon_p3</a>',
140        resolver.ResolveAllLinks(
141            'Hello $ref:bar_bon_p3, $ref:[bar_bon_p3 Bon Bon], $ref:bar_bon_p3',
142            namespace='bar.bon'))
143    self.assertEqual(
144        'I like <a href="bar.html#property-bar_t1-bar_t1_p1">food</a>.',
145        resolver.ResolveAllLinks('I like $ref:[bar.bar_p3.bar_t1_p1 food].',
146                                 namespace='foo'))
147    self.assertEqual(
148        'Ref <a href="foo.html">It\'s foo!</a>',
149        resolver.ResolveAllLinks('Ref $ref:[foo It\'s foo!]', namespace='bar'))
150    self.assertEqual(
151        'Ref <a href="bar.html#type-bon">Bon</a>',
152        resolver.ResolveAllLinks('Ref $ref:[bar.bon Bon]', namespace='bar'))
153
154    # Different kinds of whitespace can be significant inside <pre> tags.
155    self.assertEqual(
156        '<pre><a href="bar.html#type-bon">bar.bon</a>({\nkey: value})',
157        resolver.ResolveAllLinks('<pre>$ref:[bar.bon]({\nkey: value})',
158                                 namespace='baz'))
159
160    # Allow bare "$ref:foo.bar." at the end of a string.
161    self.assertEqual(
162        '<a href="bar.html#type-bon">bar.bon</a>.',
163        resolver.ResolveAllLinks('$ref:bar.bon.',
164                                 namespace='baz'))
165
166if __name__ == '__main__':
167  unittest.main()
168