Project

General

Profile

Download (44.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

    
10
package eu.etaxonomy.cdm.strategy.cache.name;
11

    
12
import static org.junit.Assert.assertEquals;
13
import static org.junit.Assert.assertNull;
14

    
15
import java.util.List;
16

    
17
import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;
18
import org.junit.Assert;
19
import org.junit.Before;
20
import org.junit.Test;
21

    
22
import eu.etaxonomy.cdm.common.UTF8;
23
import eu.etaxonomy.cdm.model.agent.Person;
24
import eu.etaxonomy.cdm.model.agent.Team;
25
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
26
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
27
import eu.etaxonomy.cdm.model.name.IBotanicalName;
28
import eu.etaxonomy.cdm.model.name.INonViralName;
29
import eu.etaxonomy.cdm.model.name.IZoologicalName;
30
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
31
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
32
import eu.etaxonomy.cdm.model.name.Rank;
33
import eu.etaxonomy.cdm.model.name.TaxonName;
34
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
35
import eu.etaxonomy.cdm.model.reference.Reference;
36
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
37
import eu.etaxonomy.cdm.strategy.cache.HTMLTagRules;
38
import eu.etaxonomy.cdm.strategy.cache.TagEnum;
39
import eu.etaxonomy.cdm.strategy.cache.TaggedCacheHelper;
40
import eu.etaxonomy.cdm.strategy.cache.TaggedText;
41
import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
42
import eu.etaxonomy.cdm.strategy.parser.TimePeriodParser;
43

    
44
/**
45
 * @author a.mueller
46
 * @since 26.11.2008
47
 */
48
public class TaxonNameDefaultCacheStrategyTest extends NameCacheStrategyTestBase {
49

    
50
    @SuppressWarnings("unused")
51
	private static final Logger logger = LogManager.getLogger(TaxonNameDefaultCacheStrategyTest.class);
52

    
53
    private TaxonNameDefaultCacheStrategy strategy;
54

    
55
    private static final String familyNameString = "Familia";
56
    private static final String genusNameString = "Genus";
57
    private static final String speciesNameString = "Abies alba";
58
    private static final String subSpeciesNameString = "Abies alba subsp. beta";
59

    
60
    private static final String authorString = "L.";
61
    private static final String exAuthorString = "Exaut.";
62
    private static final String basAuthorString = "Basio, A.";
63
    private static final String exBasAuthorString = "ExBas. N.";
64

    
65
    private static final String referenceTitle = "My Reference";
66

    
67
    private IBotanicalName familyName;
68
    private IBotanicalName genusName;
69
    private IBotanicalName subGenusName;
70
    private TaxonName speciesName;
71
    private TaxonName subSpeciesName;
72
    private TeamOrPersonBase<?> author;
73
    private TeamOrPersonBase<?> exAuthor;
74
    private TeamOrPersonBase<?> basAuthor;
75
    private TeamOrPersonBase<?> exBasAuthor;
76
    private Reference citationRef;
77

    
78
    @Before
79
    public void setUp() throws Exception {
80
        strategy = TaxonNameDefaultCacheStrategy.NewInstance();
81
        familyName = TaxonNameFactory.PARSED_BOTANICAL(familyNameString, Rank.FAMILY());
82
        genusName = TaxonNameFactory.PARSED_BOTANICAL(genusNameString, Rank.GENUS());
83

    
84
        subGenusName = TaxonNameFactory.NewBotanicalInstance(Rank.SUBGENUS());
85
        subGenusName.setGenusOrUninomial("Genus");
86
        subGenusName.setInfraGenericEpithet("InfraGenericPart");
87

    
88
        speciesName = TaxonNameFactory.PARSED_BOTANICAL(speciesNameString);
89
        subSpeciesName = TaxonNameFactory.PARSED_BOTANICAL(subSpeciesNameString);
90

    
91
        author = Person.NewInstance();
92
        author.setNomenclaturalTitleCache(authorString, true);
93
        exAuthor = Person.NewInstance();
94
        exAuthor.setNomenclaturalTitleCache(exAuthorString, true);
95
        basAuthor = Person.NewInstance();
96
        basAuthor.setNomenclaturalTitleCache(basAuthorString, true);
97
        exBasAuthor = Person.NewInstance();
98
        exBasAuthor.setNomenclaturalTitleCache(exBasAuthorString, true);
99

    
100
        citationRef = ReferenceFactory.newGeneric();
101
        citationRef.setTitleCache(referenceTitle, true);
102
    }
103

    
104
//**************************** TESTS **************************************************
105

    
106
    @Test
107
    public void testGetTitleCache() {
108
        Assert.assertEquals(speciesNameString, speciesName.getTitleCache());
109
        //TODO not yet completed
110
    }
111

    
112
    @Test
113
    public void testGetFullTitleCache() {
114
        subSpeciesName.setNomenclaturalReference(citationRef);
115
        Assert.assertEquals(subSpeciesNameString + ", " +  referenceTitle, subSpeciesName.getFullTitleCache());
116
        subSpeciesName.setNomenclaturalMicroReference("25");
117
        Assert.assertEquals(subSpeciesNameString + ", " +  referenceTitle + ": 25", subSpeciesName.getFullTitleCache());
118
        //TODO not yet completed
119
    }
120

    
121
    @Test
122
    public void testGattungsAutonyme() {
123
    	IBotanicalName botName = TaxonNameFactory.NewBotanicalInstance(Rank.SECTION_BOTANY());
124
		String strTaraxacum = "Traxacum";
125
		botName.setGenusOrUninomial(strTaraxacum);
126
		botName.setInfraGenericEpithet(strTaraxacum);
127
		botName.setAuthorshipCache("Author");
128
		Assert.assertFalse(botName.getFullTitleCache().contains("bot."));
129
		//TODO #4288
130
//		System.out.println(botName.getFullTitleCache());
131
    }
132

    
133
    @Test
134
    public void testGetNameCache() {
135
        assertEquals("Species Name should be Abies alba", speciesNameString, speciesName.getNameCache());
136
        speciesName.setNameCache("Any species");
137
        assertEquals("Species Name should be Any species", "Any species", speciesName.getNameCache());
138
        assertEquals("Species Name should be Any species", "Any species", speciesName.getTitleCache());
139
        assertEquals("subSpeciesNameString should be correct", subSpeciesNameString, subSpeciesName.getNameCache());
140
        IBotanicalName botName = TaxonNameFactory.NewBotanicalInstance(Rank.VARIETY());
141
        botName.setGenusOrUninomial("Lepidocaryum");
142
        botName.setSpecificEpithet("tenue");
143
        botName.setInfraSpecificEpithet("tenue");
144
        assertEquals("", "Lepidocaryum tenue var. tenue", botName.getNameCache());
145
        IBotanicalName specName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
146
        specName.setGenusOrUninomial("Genus");
147
        specName.setSpecificEpithet("");
148
        assertEquals("Empty species string must not result in trailing whitespace", "Genus", specName.getNameCache());
149

    
150
        //unranked taxa
151
        String unrankedCache;
152
        TaxonName unrankedName = TaxonNameFactory.NewBotanicalInstance(Rank.INFRASPECIFICTAXON());
153
        unrankedName.setGenusOrUninomial("Genus");
154
        TaxonNameDefaultCacheStrategy strategy = TaxonNameDefaultCacheStrategy.NewInstance();
155
            //infraspecific
156
        unrankedName.setInfraSpecificEpithet("infraspecific");
157
        unrankedName.setSpecificEpithet("species");
158
        unrankedCache = strategy.getNameCache(unrankedName);
159

    
160
        Assert.assertEquals("Correct unranked cache expected", "Genus species [infraspec.] infraspecific", unrankedCache);
161

    
162
            //infrageneric
163
        unrankedName.setRank(Rank.INFRAGENERICTAXON());
164
        unrankedName.setInfraSpecificEpithet(null);
165
        unrankedName.setSpecificEpithet(null);
166
        unrankedName.setInfraGenericEpithet("Infrageneric");
167
        unrankedCache = strategy.getNameCache(unrankedName);
168
        Assert.assertEquals("Correct unranked cache expected", "Genus [unranked] Infrageneric", unrankedCache);
169

    
170
        //bot. specific ranks
171
        botName = TaxonNameFactory.NewBotanicalInstance(Rank.SECTION_BOTANY());
172
        botName.setGenusOrUninomial("Genus");
173
        botName.setInfraGenericEpithet("Infragenus");
174
        Assert.assertEquals("", "Genus sect. Infragenus", botName.getNameCache());
175
        botName.setRank(Rank.SUBSECTION_BOTANY());
176
        botName.setNameCache(null, false);
177
        Assert.assertEquals("", "Genus subsect. Infragenus", botName.getNameCache());
178

    
179
        //zool. specific ranks (we don't have markers here therefore no problem should exist
180
        IZoologicalName zooName = TaxonNameFactory.NewZoologicalInstance(Rank.SECTION_ZOOLOGY());
181
        zooName.setGenusOrUninomial("Genus");
182
        zooName.setInfraGenericEpithet("Infragenus");
183
        Assert.assertEquals("", "Genus", zooName.getNameCache());
184
        zooName.setRank(Rank.SUBSECTION_ZOOLOGY());
185
        Assert.assertEquals("", "Genus", zooName.getNameCache());
186
    }
187

    
188
    @Test
189
    public void testNameCacheWithInfraGenericEpithet() {
190
        speciesName.setInfraGenericEpithet("Infraabies");
191
        assertEquals("Species Name should be Abies (Infraabies) alba", "Abies (Infraabies) alba", speciesName.getNameCache());
192

    
193
        IBotanicalName botName = TaxonNameFactory.NewBotanicalInstance(Rank.VARIETY());
194
        botName.setGenusOrUninomial("Lepidocaryum");
195
        botName.setInfraGenericEpithet("Infralepi");
196
        botName.setSpecificEpithet("tenue");
197
        botName.setInfraSpecificEpithet("tenue");
198
        assertEquals("Name cache should be Lepidocaryum (Infralepi) tenue var. tenue", "Lepidocaryum (Infralepi) tenue var. tenue", botName.getNameCache());
199

    
200
        botName.setInfraGenericEpithet(" ");
201
        botName.setNameCache(null, false);
202
        assertEquals("Empty infrageneric epithet must be neglegted", "Lepidocaryum tenue var. tenue", botName.getNameCache());
203
    }
204

    
205
    @Test
206
    public void testGetAuthorshipCache() {
207
        this.speciesName.setCombinationAuthorship(author);
208
        assertEquals(author.getNomenclaturalTitleCache(), speciesName.getAuthorshipCache());
209
        this.speciesName.setBasionymAuthorship(basAuthor);
210
        String expected = strategy.getBasionymStart()+ basAuthor.getNomenclaturalTitleCache()+strategy.getBasionymEnd()+strategy.getBasionymAuthorCombinationAuthorSeperator()+author.getNomenclaturalTitleCache();
211
        assertEquals(expected, speciesName.getAuthorshipCache());
212
        String authorshipcache = "authorshipcache";
213
        speciesName.setAuthorshipCache(authorshipcache);
214
        assertEquals(authorshipcache, speciesName.getAuthorshipCache());
215
        speciesName.setCombinationAuthorship(exAuthor);
216
        assertEquals(authorshipcache, speciesName.getAuthorshipCache()); //cache is protected
217
        assertEquals(speciesNameString + " " + authorshipcache, speciesName.getFullTitleCache());
218
        //unprotected
219
        speciesName.setProtectedAuthorshipCache(false);
220
        String atomizedAuthorCache = strategy.getBasionymStart()+ basAuthor.getNomenclaturalTitleCache()+strategy.getBasionymEnd()+strategy.getBasionymAuthorCombinationAuthorSeperator()+exAuthor.getNomenclaturalTitleCache();
221
        assertEquals(atomizedAuthorCache, speciesName.getAuthorshipCache());
222
        String atomizedTitleCache = speciesNameString + " "+ strategy.getBasionymStart()+ basAuthor.getNomenclaturalTitleCache()+strategy.getBasionymEnd()+strategy.getBasionymAuthorCombinationAuthorSeperator()+exAuthor.getNomenclaturalTitleCache();
223
        //Note: This test may fail if aspectj doesn't work correctly
224
        assertEquals(atomizedTitleCache, speciesName.getTitleCache());
225
        speciesName.setFullTitleCache(null, false);
226
        assertEquals(atomizedTitleCache, speciesName.getFullTitleCache());
227
    }
228

    
229
    @Test
230
    public void testHybridNames() {
231
        //Note \u00D7 : hybrid sign (multiplication sign)
232
        this.speciesName.setCombinationAuthorship(author);
233
        Assert.assertEquals(author.getNomenclaturalTitleCache(), speciesName.getAuthorshipCache());
234
        Assert.assertEquals("Should be Abies alba L.", "Abies alba L.", speciesName.getTitleCache());
235

    
236
        speciesName.setBinomHybrid(true);
237
        speciesName.setTitleCache(null, false);
238
        Assert.assertEquals("Should be Abies \u00D7alba L.", "Abies \u00D7alba L.", speciesName.getTitleCache());
239
        speciesName.setMonomHybrid(true);
240
        speciesName.setTitleCache(null, false);
241
        Assert.assertEquals("Should be '\u00D7Abies \u00D7alba L.'", "\u00D7Abies \u00D7alba L.", speciesName.getTitleCache());
242

    
243
        Assert.assertEquals("Should be 'Genus'", "Genus", genusName.getTitleCache());
244
        genusName.setMonomHybrid(true);
245
        genusName.setTitleCache(null, false);
246
        Assert.assertEquals("Should be '\u00D7Genus'", "\u00D7Genus", genusName.getTitleCache());
247

    
248
        Assert.assertEquals("Should be 'Abies alba subsp. beta'", subSpeciesNameString, subSpeciesName.getTitleCache());
249
        subSpeciesName.setTrinomHybrid(true);
250
        subSpeciesName.setTitleCache(null, false);
251
        Assert.assertEquals("Should be 'Abies alba nothosubsp. beta or nbeta'", "Abies alba nothosubsp. beta", subSpeciesName.getTitleCache());
252
        subSpeciesName.setMonomHybrid(true);
253
        subSpeciesName.setTitleCache(null, false);
254
        Assert.assertEquals("Should be '\u00D7Abies alba nothosubsp. beta'", "\u00D7Abies alba nothosubsp. beta", subSpeciesName.getTitleCache());
255

    
256
        Assert.assertEquals("Should be 'Genus subg. InfraGenericPart'", "Genus subg. InfraGenericPart", subGenusName.getTitleCache());
257
        subGenusName.setBinomHybrid(true);
258
        subGenusName.setTitleCache(null, false);
259
        Assert.assertEquals("Should be 'Genus nothosubg. InfraGenericPart'", "Genus nothosubg. InfraGenericPart", subGenusName.getTitleCache());
260
    }
261

    
262
    @Test
263
    public void testHybridFormula(){
264
        this.speciesName.setCombinationAuthorship(author);
265
        Assert.assertEquals(author.getNomenclaturalTitleCache(), speciesName.getAuthorshipCache());
266
        Assert.assertEquals("Should be 'Abies alba L.'", "Abies alba L.", speciesName.getTitleCache());
267

    
268
        INonViralName hybridName = TaxonNameFactory.NewNonViralInstance(Rank.SPECIES());
269
        INonViralName secondParent = TaxonNameFactory.NewNonViralInstance(Rank.SPECIES());
270

    
271
        secondParent.setTitleCache("Second parent Mill.", true);
272
        hybridName.addHybridParent(speciesName, HybridRelationshipType.FIRST_PARENT(), null);
273
        hybridName.addHybridParent(secondParent, HybridRelationshipType.SECOND_PARENT(), null);
274
        hybridName.setHybridFormula(true);
275

    
276
        Assert.assertEquals("", "Abies alba L. \u00D7 Second parent Mill.", hybridName.getTitleCache());
277
        //Note: handling of empty nameCache of parents may change in future
278
        Assert.assertEquals("", "Abies alba \u00D7", hybridName.getNameCache());
279
        secondParent.setGenusOrUninomial("Second");
280
        secondParent.setSpecificEpithet("parent");
281
        hybridName.setNameCache(null, false);
282
        Assert.assertEquals("", "Abies alba \u00D7 Second parent", hybridName.getNameCache());
283
    }
284

    
285
    //#9778
286
    @Test
287
    public void testOldRanks(){
288

    
289
        //grex
290
        subSpeciesName.setRank(Rank.GREX_INFRASPEC());
291
        Assert.assertEquals("Abies alba grex beta", strategy.getTitleCache(subSpeciesName));
292
        //subgrex
293
        subSpeciesName.setRank(Rank.SUBGREX());
294
        Assert.assertEquals("Abies alba subgrex beta", strategy.getTitleCache(subSpeciesName));
295
        //proles
296
        subSpeciesName.setRank(Rank.PROLES());
297
        Assert.assertEquals("Abies alba proles beta", strategy.getTitleCache(subSpeciesName));
298
        //proles
299
        subSpeciesName.setRank(Rank.SUBPROLES());
300
        Assert.assertEquals("Abies alba subproles beta", strategy.getTitleCache(subSpeciesName));
301
        //lusus
302
        subSpeciesName.setRank(Rank.LUSUS());
303
        Assert.assertEquals("Abies alba lusus beta", strategy.getTitleCache(subSpeciesName));
304
        //sublusus
305
        subSpeciesName.setRank(Rank.SUBLUSUS());
306
        Assert.assertEquals("Abies alba sublusus beta", strategy.getTitleCache(subSpeciesName));
307
    }
308

    
309
    //#9754
310
    @Test
311
    public void testCultivar(){
312

    
313
        //cultivar
314
        speciesName.setRank(Rank.CULTIVAR());
315
        speciesName.setCultivarEpithet("Cultus");
316
        Assert.assertEquals("Abies alba 'Cultus'", strategy.getTitleCache(speciesName));
317

    
318
        speciesName.setBinomHybrid(true);
319
        Assert.assertEquals("Abies \u00D7alba 'Cultus'", strategy.getTitleCache(speciesName));
320

    
321
        speciesName.setBinomHybrid(false);
322
        speciesName.setSpecificEpithet(null);
323
        Assert.assertEquals("Abies 'Cultus'", strategy.getTitleCache(speciesName));
324

    
325
        speciesName.setCombinationAuthorship(author);
326
        Assert.assertEquals("Abies 'Cultus' L.", strategy.getTitleCache(speciesName));
327
        speciesName.setBasionymAuthorship(basAuthor);
328
        speciesName.setExCombinationAuthorship(exAuthor);
329
        speciesName.setExBasionymAuthorship(exBasAuthor);
330
        Assert.assertEquals("Basionym and ex-authors should not be considered for cultivar names"
331
                , "Abies 'Cultus' L.", strategy.getTitleCache(speciesName));
332
        speciesName.setNomenclaturalReference(citationRef);
333
        Assert.assertEquals("Abies 'Cultus' L., My Reference", strategy.getFullTitleCache(speciesName));
334
        speciesName.setCombinationAuthorship(null);
335
        speciesName.setBasionymAuthorship(null);
336
        speciesName.setExCombinationAuthorship(null);
337
        speciesName.setExBasionymAuthorship(null);
338
        speciesName.setNomenclaturalReference(null);
339

    
340
        speciesName.setCultivarEpithet(null);
341
        Assert.assertEquals("Correct formatting for incorrect name needs to be discussed", "Abies ''", strategy.getTitleCache(speciesName));
342

    
343
        //cultivar group
344
        speciesName.setRank(Rank.CULTIVARGROUP());
345
        Assert.assertEquals("Abies Group", strategy.getTitleCache(speciesName)); //not sure if this is correct for an empty group field
346
        speciesName.setCultivarGroupEpithet("Cultus Group");
347
        Assert.assertEquals("Abies Cultus Group", strategy.getTitleCache(speciesName));
348

    
349
        speciesName.setCultivarGroupEpithet("Cultus Gruppe");
350
        Assert.assertEquals("Abies Cultus Gruppe", strategy.getTitleCache(speciesName));
351
        speciesName.setCultivarGroupEpithet("Cultus Gp");
352
        Assert.assertEquals("Abies Cultus Gp", strategy.getTitleCache(speciesName));
353
        speciesName.setCultivarGroupEpithet("Gruppo Cultus");
354
        Assert.assertEquals("Abies Gruppo Cultus", strategy.getTitleCache(speciesName));
355
        speciesName.setCultivarGroupEpithet("Druppo Cultus");
356
        Assert.assertEquals("Abies Druppo Cultus Group", strategy.getTitleCache(speciesName));
357
        speciesName.setCultivarGroupEpithet(null);
358
        Assert.assertEquals("Correct formatting for missing epithet needs to be discussed", "Abies Group", strategy.getTitleCache(speciesName));
359

    
360
        //grex
361
        speciesName.setRank(Rank.GREX_ICNCP());
362
        speciesName.setCultivarGroupEpithet("Lovely");
363
        Assert.assertEquals("Abies Lovely grex", strategy.getTitleCache(speciesName));
364
        speciesName.setCultivarGroupEpithet(null);
365
        Assert.assertEquals("Correct formatting for missing epithet needs to be discussed", "Abies grex", strategy.getTitleCache(speciesName));
366

    
367
        //subspecies name
368
        subSpeciesName.setRank(Rank.CULTIVAR());
369
        subSpeciesName.setCultivarEpithet("Cultus");
370
        Assert.assertEquals("Infraspecific epithet in cultivars can not be handled correctly yet", "Abies alba beta 'Cultus'", strategy.getTitleCache(subSpeciesName));
371
        subSpeciesName.setInfraSpecificEpithet("var. beta");
372
        Assert.assertEquals("Abies alba var. beta 'Cultus'", strategy.getTitleCache(subSpeciesName));
373

    
374

    
375
        //graft chimaera
376
        //https://en.wikipedia.org/wiki/Graft-chimaera
377
        //either formula (like hybrids) concatenated by ' + ' (Art. 24.2)
378
        speciesName.setRank(Rank.GRAFTCHIMAERA());
379
        speciesName.setGenusOrUninomial("Laburnocytisus");
380
        speciesName.setCultivarEpithet("Adamii");
381
        Assert.assertEquals("+ Laburnocytisus 'Adamii'", strategy.getTitleCache(speciesName));
382
        //tbc
383

    
384
        //denomination class (only dummy implementation, may change in future)
385
        speciesName.setRank(Rank.DENOMINATIONCLASS());
386
        speciesName.setGenusOrUninomial("Laburnocytisus");
387
        speciesName.setCultivarEpithet("Adamii");
388
        Assert.assertEquals("Laburnocytisus 'Adamii'", strategy.getTitleCache(speciesName));
389

    
390

    
391
        //appended phrase
392
        speciesName.setRank(Rank.CULTIVAR());
393
        speciesName.setGenusOrUninomial("Abies");
394
        speciesName.setSpecificEpithet("alba");
395
        speciesName.setCultivarEpithet("Cultus");
396
        speciesName.setAppendedPhrase("appended");
397
        Assert.assertEquals("Abies alba 'Cultus' appended", strategy.getTitleCache(speciesName));
398

    
399
    }
400

    
401
    //3665
402
    @Test
403
    public void testOriginalSpelling() {
404

    
405
        TaxonName originalName = speciesName.clone();
406
    	originalName.setSpecificEpithet("alpa");
407
    	Assert.assertEquals("Preconditions are wrong", "Abies alpa", originalName.getTitleCache());
408
        Assert.assertEquals("Name cache should not show original spelling", "Abies alpa", originalName.getNameCache());
409

    
410
    	speciesName.setOriginalSpelling(originalName);
411
    	Assert.assertEquals("Abies alba [as \"alpa\"]", speciesName.getFullTitleCache());
412
        Assert.assertEquals("Abies alba", speciesName.getTitleCache());
413
        Assert.assertEquals("Name cache should not show original spelling", "Abies alba", speciesName.getNameCache());
414

    
415
    	originalName.setGenusOrUninomial("Apies");
416
    	speciesName.setFullTitleCache(null, false);
417
    	originalName.setNameCache(null, false);
418
    	//TODO update cache of current name (species name)
419
    	Assert.assertEquals("Abies alba [as \"Apies alpa\"]", speciesName.getFullTitleCache());
420
        Assert.assertEquals("Abies alba", speciesName.getTitleCache());
421
        Assert.assertEquals("Name cache should not show original spelling", "Abies alba", speciesName.getNameCache());
422
        originalName.setSpecificEpithet("alba");
423
        originalName.setNameCache(null, false);
424
        speciesName.setFullTitleCache(null, false);
425
        //not fully sure if it is wanted that here only the genus name is given and not the specific epithet too, may change if required by users
426
        Assert.assertEquals("Abies alba [as \"Apies\"]", speciesName.getFullTitleCache());
427

    
428
        //subspecies
429
        originalName = subSpeciesName.clone();
430
        originalName.setInfraSpecificEpithet("peta");
431
        Assert.assertEquals("Preconditions are wrong", "Abies alba subsp. peta", originalName.getTitleCache());
432
        subSpeciesName.setOriginalSpelling(originalName);
433
        Assert.assertEquals("Abies alba subsp. beta [as \"peta\"]", subSpeciesName.getFullTitleCache());
434
        Assert.assertEquals("Abies alba subsp. beta", subSpeciesName.getTitleCache());
435
        originalName.setSpecificEpithet("alpa");
436
        originalName.setNameCache(null, false);
437
        subSpeciesName.setFullTitleCache(null, false);
438
        Assert.assertEquals("Abies alba subsp. beta [as \"alpa subsp. peta\"]", subSpeciesName.getFullTitleCache());
439

    
440
        originalName.setInfraSpecificEpithet("beta");
441
        originalName.setNameCache(null, false);
442
        subSpeciesName.setFullTitleCache(null, false);
443
        //not fully sure if it is wanted that here only the specific epithet is given and not the infra specific epithet too, may change if required by users
444
        Assert.assertEquals("Abies alba subsp. beta [as \"alpa\"]", subSpeciesName.getFullTitleCache());
445

    
446
    	INonViralName correctName = NonViralNameParserImpl.NewInstance().parseFullName("Nepenthes glabrata J.R.Turnbull & A.T.Middleton");
447
    	TaxonName originalSpelling = (TaxonName)NonViralNameParserImpl.NewInstance().parseFullName("Nepenthes glabratus");
448
    	correctName.setOriginalSpelling(originalSpelling);
449
    	Assert.assertEquals("Nepenthes glabrata", correctName.getNameCache());
450
    	Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton", correctName.getTitleCache());
451
    	Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton [as \"glabratus\"]", correctName.getFullTitleCache());
452

    
453
    	correctName.setNomenclaturalReference(citationRef);
454
        Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton, My Reference [as \"glabratus\"]", correctName.getFullTitleCache());
455
        citationRef.setProtectedTitleCache(false);
456
        citationRef.setTitle("Sp. Pl.");
457
        citationRef.setDatePublished(TimePeriodParser.parseStringVerbatim("1988"));
458
        correctName.setFullTitleCache(null, false);
459
        Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton, Sp. Pl. 1988 [as \"glabratus\"]", correctName.getFullTitleCache());
460
        correctName.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE()));
461
        correctName.setFullTitleCache(null, false);
462
        Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton, Sp. Pl. 1988 [as \"glabratus\"], nom. illeg.", correctName.getFullTitleCache());
463
    }
464

    
465
    //3667
466
    @Test
467
    public void testOriginalSpellingItalics() {
468

    
469
        TaxonName originalName = subSpeciesName.clone();
470
        originalName.setSpecificEpithet("alpa");
471
        Assert.assertEquals("Preconditions are wrong", "Abies alpa subsp. beta", originalName.getTitleCache());
472

    
473
        subSpeciesName.setOriginalSpelling(originalName);
474

    
475
        List<TaggedText> taggedFullTitle = subSpeciesName.cacheStrategy().getTaggedFullTitle(subSpeciesName);
476
        Assert.assertEquals(7, taggedFullTitle.size());
477
        Assert.assertEquals(new TaggedText(TagEnum.name, "Abies"), taggedFullTitle.get(0));
478
        Assert.assertEquals(new TaggedText(TagEnum.name, "alba"), taggedFullTitle.get(1));
479
        Assert.assertEquals(new TaggedText(TagEnum.rank, "subsp."), taggedFullTitle.get(2));
480
        Assert.assertEquals(new TaggedText(TagEnum.name, "beta"), taggedFullTitle.get(3));
481
        Assert.assertEquals(new TaggedText(TagEnum.separator, " [as \""), taggedFullTitle.get(4));
482
        Assert.assertEquals(new TaggedText(TagEnum.name, "alpa"), taggedFullTitle.get(5));
483
        Assert.assertEquals(new TaggedText(TagEnum.separator, "\"]"), taggedFullTitle.get(6));
484

    
485
        originalName.setInfraSpecificEpithet("peta");
486
        originalName.setNameCache(null, false);
487
        taggedFullTitle = subSpeciesName.cacheStrategy().getTaggedFullTitle(subSpeciesName);
488
        Assert.assertEquals(9, taggedFullTitle.size());
489
        Assert.assertEquals(new TaggedText(TagEnum.name, "alba"), taggedFullTitle.get(1));
490
        Assert.assertEquals(new TaggedText(TagEnum.name, "Abies"), taggedFullTitle.get(0));
491
        Assert.assertEquals(new TaggedText(TagEnum.name, "alba"), taggedFullTitle.get(1));
492
        Assert.assertEquals(new TaggedText(TagEnum.rank, "subsp."), taggedFullTitle.get(2));
493
        Assert.assertEquals(new TaggedText(TagEnum.name, "beta"), taggedFullTitle.get(3));
494
        Assert.assertEquals(new TaggedText(TagEnum.separator, " [as \""), taggedFullTitle.get(4));
495
        Assert.assertEquals(new TaggedText(TagEnum.name, "alpa"), taggedFullTitle.get(5));
496
        Assert.assertEquals(new TaggedText(TagEnum.rank, "subsp."), taggedFullTitle.get(6));
497
        Assert.assertEquals(new TaggedText(TagEnum.name, "peta"), taggedFullTitle.get(7));
498
        Assert.assertEquals(new TaggedText(TagEnum.separator, "\"]"), taggedFullTitle.get(8));
499
    }
500

    
501
    @Test
502
    public void testCacheListener() {
503
        Reference ref = ReferenceFactory.newGeneric();
504
        ref.setTitleCache("GenericRef",true);
505
        this.subSpeciesName.setNomenclaturalReference(ref);
506
        Assert.assertEquals("Expected full title cache has error", "Abies alba subsp. beta, GenericRef", subSpeciesName.getFullTitleCache());
507
        subSpeciesName.setCombinationAuthorship(author);
508
        subSpeciesName.setBasionymAuthorship(basAuthor);
509
        Assert.assertEquals("Expected full title cache has error", "Abies alba subsp. beta (Basio, A.) L., GenericRef", subSpeciesName.getFullTitleCache());
510
        //cascade name change to fullTitleCache
511
        subSpeciesName.setRank(Rank.SPECIES());
512
        subSpeciesName.setProtectedNameCache(true);
513
        Assert.assertNull("name cache should be null", subSpeciesName.getNameCache());
514
        subSpeciesName.setProtectedNameCache(false);
515
        Assert.assertNotNull("name cache should not be null", subSpeciesName.getNameCache());
516
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L., GenericRef", subSpeciesName.getFullTitleCache());
517
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L.", subSpeciesName.getTitleCache());
518
        Assert.assertEquals("Expected full title cache has error", "Abies alba", subSpeciesName.getNameCache());
519

    
520
        subSpeciesName.setProtectedNameCache(true);
521
        subSpeciesName.setSpecificEpithet("gamma");
522
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L., GenericRef", subSpeciesName.getFullTitleCache());
523
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L.", subSpeciesName.getTitleCache());
524
        Assert.assertEquals("Expected full title cache has error", "Abies alba", subSpeciesName.getNameCache());
525
        //make original status
526
        subSpeciesName.setRank(Rank.SUBSPECIES());
527
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L., GenericRef", subSpeciesName.getFullTitleCache());
528

    
529
        //author change
530
        author.setNomenclaturalTitleCache("M.", true);
531
        Assert.assertEquals("Expected full title cache has error", "(Basio, A.) M.", subSpeciesName.getAuthorshipCache());
532
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
533
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) M.", subSpeciesName.getTitleCache());
534

    
535
        //protectedTitleCache
536
        subSpeciesName.setProtectedTitleCache(true);
537
        subSpeciesName.setProtectedNameCache(false);
538
        subSpeciesName.setGenusOrUninomial("Pinus");
539
        subSpeciesName.setSpecificEpithet("alba");
540
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta", subSpeciesName.getNameCache());
541
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
542
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) M.", subSpeciesName.getTitleCache());
543

    
544
        subSpeciesName.setTitleCache("Pinus beta C.", true);
545
        Assert.assertEquals("Expected full title cache has error", "Pinus beta C., GenericRef", subSpeciesName.getFullTitleCache());
546
        subSpeciesName.setProtectedTitleCache(false);
547

    
548
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
549

    
550
        //protected full title cache set
551
        subSpeciesName.setFullTitleCache("ABC");
552
        Assert.assertEquals("Expected full title cache has error", "ABC", subSpeciesName.getFullTitleCache());
553
        subSpeciesName.setProtectedFullTitleCache(false);
554
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
555

    
556
        //protected title cache set
557
        subSpeciesName.setProtectedTitleCache(false);
558
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
559

    
560
        //protectedNameCache set
561
        subSpeciesName.setProtectedNameCache(true);
562
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
563
        subSpeciesName.setNameCache("P. alba subsp. beta");
564
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
565

    
566
        subSpeciesName.setGenusOrUninomial("A.");
567
        subSpeciesName.setProtectedNameCache(false);
568
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
569
        subSpeciesName.setNameCache("P. alba subsp. beta");
570
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
571

    
572
        //protected authorship
573
        subSpeciesName.setProtectedAuthorshipCache(true);
574
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
575
        subSpeciesName.setAuthorshipCache("Ciard.");
576
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta Ciard., GenericRef", subSpeciesName.getFullTitleCache());
577

    
578
        author.setNomenclaturalTitleCache("X.", true);
579
        subSpeciesName.setProtectedAuthorshipCache(false);
580
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
581

    
582
        //clear
583
        subSpeciesName.setProtectedNameCache(false);
584
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
585

    
586
        //appended phrase
587
        subSpeciesName.setProtectedNameCache(true);
588
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
589
        subSpeciesName.setAppendedPhrase("app phrase");
590
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
591
        subSpeciesName.setProtectedNameCache(false);
592
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta app phrase (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
593
        subSpeciesName.setAppendedPhrase("app2 phrase2");
594
        subSpeciesName.setProtectedNameCache(true);
595
        Assert.assertNull("NameCache should be null", subSpeciesName.getNameCache());
596
        subSpeciesName.setProtectedNameCache(false);
597
        subSpeciesName.setAppendedPhrase(null);
598

    
599
        //ref + nomRef
600
        Reference book = ReferenceFactory.newBook();
601
        book.setTitle("Booktitle");
602
        Assert.assertNotNull("TitleCache should not be null", subSpeciesName.getTitleCache());
603
        subSpeciesName.setNomenclaturalReference(book);
604
        subSpeciesName.setNomenclaturalMicroReference("22");
605
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) X., Booktitle: 22", subSpeciesName.getFullTitleCache());
606
        subSpeciesName.setProtectedTitleCache(true);
607
        Assert.assertNotNull("TitleCache should not be null", subSpeciesName.getTitleCache());
608

    
609
        //year
610
        IZoologicalName zooName = TaxonNameFactory.NewZoologicalInstance(Rank.SPECIES());
611
        zooName.setGenusOrUninomial("Homo");
612
        zooName.setSpecificEpithet("sapiens");
613
        zooName.setBasionymAuthorship(basAuthor);
614
        zooName.setCombinationAuthorship(author);
615
        zooName.setNomenclaturalReference(book);
616
        zooName.setNomenclaturalMicroReference("22");
617
        Assert.assertEquals("Expected full title cache has error", "Homo sapiens (Basio, A.) X., Booktitle: 22", zooName.getFullTitleCache());
618

    
619
        zooName.setOriginalPublicationYear(1922);
620
        zooName.setPublicationYear(1948);
621
        Assert.assertEquals("Expected full title cache has error", "Homo sapiens (Basio, A., 1922) X., 1948, Booktitle: 22", zooName.getFullTitleCache());
622
        zooName.setOriginalPublicationYear(1923);
623
        zooName.setProtectedAuthorshipCache(true);
624
        Assert.assertNull("AuthorshipCache should be null", zooName.getAuthorshipCache());
625
        zooName.setProtectedAuthorshipCache(false);
626
        Assert.assertNotNull("AuthorshipCache should not be null", zooName.getAuthorshipCache());
627
        zooName.setPublicationYear(1949);
628
        zooName.setProtectedAuthorshipCache(true);
629
        Assert.assertNull("AuthorshipCache should be null", zooName.getAuthorshipCache());
630

    
631
    }
632

    
633
    @Test
634
    public void testGetSetNameAuthorSeperator() {
635
        String authorSeparator = "authorSeparator";
636
        strategy.setNameAuthorSeperator(authorSeparator);
637
        assertEquals(authorSeparator, strategy.getNameAuthorSeperator());
638
        strategy.setNameAuthorSeperator(null);
639
        assertNull(strategy.getNameAuthorSeperator());
640
    }
641

    
642
    @Test
643
    public void testGetSetBasionymStart() {
644
        String basStart = "start";
645
        strategy.setBasionymStart(basStart);
646
        assertEquals(basStart, strategy.getBasionymStart());
647
        strategy.setBasionymStart(null);
648
        assertNull(strategy.getBasionymStart());
649
    }
650

    
651
    @Test
652
    public void testGetSetBasionymEnd() {
653
        String basEnd = "end";
654
        strategy.setBasionymEnd(basEnd);
655
        assertEquals(basEnd, strategy.getBasionymEnd());
656
        strategy.setBasionymEnd(null);
657
        assertNull(strategy.getBasionymEnd());
658
    }
659

    
660
    @Test
661
    public void testGetSetExAuthorSeperator() {
662
        String exAuthorSeparator = "exAuthorSeparator";
663
        strategy.setExAuthorSeperator(exAuthorSeparator);
664
        assertEquals(exAuthorSeparator, strategy.getExAuthorSeperator());
665
        strategy.setExAuthorSeperator(null);
666
        assertNull(strategy.getExAuthorSeperator());
667
    }
668

    
669
    @Test
670
    public void testSetBasionymAuthorCombinationAuthorSeperator() {
671
        String basComSeparator = "basComSeparator";
672
        strategy.setBasionymAuthorCombinationAuthorSeperator(basComSeparator);
673
        assertEquals(basComSeparator, strategy.getBasionymAuthorCombinationAuthorSeperator());
674
        strategy.setBasionymAuthorCombinationAuthorSeperator(null);
675
        assertNull(strategy.getBasionymAuthorCombinationAuthorSeperator());
676
    }
677

    
678
    @Test
679
    public void testGetInfraGenericNames(){
680
        String author = "Anyauthor";
681
        TaxonName nonViralName = TaxonNameFactory.NewNonViralInstance(Rank.SUBGENUS());
682
        nonViralName.setGenusOrUninomial("Genus");
683
        nonViralName.setInfraGenericEpithet("subgenus");
684
        nonViralName.setAuthorshipCache(author);
685

    
686
        //test ordinary infrageneric
687
        List<TaggedText> subGenusNameCacheTagged = strategy.getInfraGenusTaggedNameCache(nonViralName, false);
688
        String subGenusNameCache = TaggedCacheHelper.createString(subGenusNameCacheTagged);
689
        assertEquals("Subgenus name should be 'Genus subg. subgenus'.", "Genus subg. subgenus", subGenusNameCache);
690
        String subGenusTitle = strategy.getTitleCache(nonViralName);
691
        assertEquals("Subgenus name should be 'Genus subg. subgenus Anyauthor'.", "Genus subg. subgenus Anyauthor", subGenusTitle);
692

    
693
        //test species aggregates and species groups
694
        nonViralName.setRank(Rank.SPECIESAGGREGATE());
695
        nonViralName.setSpecificEpithet("myspecies");
696
        nonViralName.setInfraGenericEpithet(null);
697
        nonViralName.setAuthorshipCache(null);
698

    
699
        List<TaggedText> aggrNameCacheTagged = strategy.getInfraGenusTaggedNameCache(nonViralName, false);
700

    
701
        String aggrNameCache = TaggedCacheHelper.createString(aggrNameCacheTagged);
702
        assertEquals("Species aggregate name should be 'Genus myspecies aggr.'.", "Genus myspecies aggr.", aggrNameCache);
703
        String aggrNameTitle = strategy.getTitleCache(nonViralName);
704
        Assert.assertTrue("Species aggregate should not include author information.", aggrNameTitle.indexOf(author) == -1);
705
        assertEquals("Species aggregate name should be 'Genus myspecies aggr.'.", "Genus myspecies aggr.", aggrNameTitle);
706
        nonViralName.setRank(Rank.SPECIESGROUP());
707
        String groupNameTitle = strategy.getTitleCache(nonViralName);
708
        assertEquals("Species group name should be 'Genus myspecies species group'.", "Genus myspecies species group", groupNameTitle);
709

    
710
        //test species aggregates and species groups with infrageneric information
711
        //TODO check if groups do ever have infrageneric epithets
712
        nonViralName.setRank(Rank.SPECIESAGGREGATE());
713
        nonViralName.setSpecificEpithet("myspecies");
714
        nonViralName.setInfraGenericEpithet("Infragenus");
715

    
716
        aggrNameCacheTagged = strategy.getInfraGenusTaggedNameCache(nonViralName, false);
717
        aggrNameCache = TaggedCacheHelper.createString(aggrNameCacheTagged);
718
        assertEquals("Species aggregate name should be 'Genus (Infragenus) myspecies aggr.'.", "Genus (Infragenus) myspecies aggr.", aggrNameCache);
719

    
720
        aggrNameTitle = strategy.getTitleCache(nonViralName);
721
        Assert.assertTrue("Species aggregate should not include author information.", aggrNameTitle.indexOf(author) == -1);
722
        assertEquals("Species aggregate name should be 'Genus (Infragenus) myspecies aggr.'.", "Genus (Infragenus) myspecies aggr.", aggrNameTitle);
723

    
724
        nonViralName.setRank(Rank.SPECIESGROUP());
725
        groupNameTitle = strategy.getTitleCache(nonViralName);
726
        assertEquals("Species group name should be 'Genus (Infragenus) myspecies species group'.", "Genus (Infragenus) myspecies species group", groupNameTitle);
727

    
728
        //aggregates with author and nom.ref. information #4288
729
        nonViralName.setRank(Rank.SPECIESAGGREGATE());
730
        nonViralName.setSpecificEpithet("myspecies");
731
        nonViralName.setInfraGenericEpithet(null);
732
        nonViralName.setAuthorshipCache("L.");
733

    
734
        aggrNameCacheTagged = strategy.getTaggedTitle(nonViralName);
735
        aggrNameCache = TaggedCacheHelper.createString(aggrNameCacheTagged);
736
        assertEquals("Species aggregate name should be 'Genus myspecies L.'.", "Genus myspecies L.", aggrNameCache);
737

    
738
    }
739

    
740
    @Test
741
    public void testGetTaggedNameSpeciesAggregate() {
742
        TaxonName speciesAggregate = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIESAGGREGATE());
743
        speciesAggregate.setGenusOrUninomial("Mygenus");
744
        speciesAggregate.setSpecificEpithet("myspecies");
745
        List<TaggedText> taggedName = strategy.getTaggedName(speciesAggregate);
746
        Assert.assertEquals("1rd tag must be genus epithet", "Mygenus", taggedName.get(0).getText());
747
        Assert.assertEquals("2rd tag must be species epithet", "myspecies", taggedName.get(1).getText());
748
        Assert.assertEquals("3rd tag must be aggregate marker", "aggr.",taggedName.get(2).getText());
749
    }
750

    
751
    @Test
752
    public void testGetTaggedNameSubspecies(){
753
        List<TaggedText> taggedName = strategy.getTaggedName(subSpeciesName);
754
        Assert.assertEquals("First tag should be 'Abies'", "Abies", taggedName.get(0).getText());
755
        Assert.assertEquals("Second tag should be 'alba'", "alba", taggedName.get(1).getText());
756
        Assert.assertEquals("Third tag should be subspecies rank, and rank abbreviatioin should be subsp.", "subsp.", taggedName.get(2).getText());
757
        Assert.assertEquals("Fourth tag should be 'beta'", "beta", taggedName.get(3).getText());
758
        //to be continued
759
    }
760

    
761
    @Test
762
    public void testTitleCacheHtmlTagged(){
763
    	HTMLTagRules rules = new HTMLTagRules().addRule(TagEnum.name, "i");
764
    	Assert.assertEquals("<i>Abies alba</i>", strategy.getTitleCache(speciesName, rules));
765
    	rules.addRule(TagEnum.name, "b");
766
    	Assert.assertEquals("<b><i>Abies alba</i></b>", strategy.getTitleCache(speciesName, rules));
767
    	speciesName.setCombinationAuthorship(author);
768
    	Assert.assertEquals("<b><i>Abies alba</i></b> L.", strategy.getTitleCache(speciesName, rules));
769
    	rules.addRule(TagEnum.authors, "i");
770
    	Assert.assertEquals("<b><i>Abies alba</i></b> <i>L.</i>", strategy.getTitleCache(speciesName, rules));
771
    	rules = new HTMLTagRules().addRule(TagEnum.name, "i").addRule(TagEnum.name, "b").addRule(TagEnum.authors, "b");
772
    	Assert.assertEquals("<b><i>Abies alba</i> L.</b>", strategy.getTitleCache(speciesName, rules));
773
    }
774

    
775
    @Test //#2888
776
    public void testAutonymWithExAuthor(){
777
    	IBotanicalName name = TaxonNameFactory.NewBotanicalInstance(Rank.FORM());
778
    	name.setGenusOrUninomial("Euphorbia");
779
    	name.setSpecificEpithet("atropurpurea");
780
    	name.setInfraSpecificEpithet("atropurpurea");
781
    	Team combTeam = Team.NewTitledInstance("Combauthor", "Combauthor");
782
    	name.setCombinationAuthorship(combTeam);
783
    	Team exCombTeam = Team.NewTitledInstance("Excomb", "Excomb");
784
    	name.setExCombinationAuthorship(exCombTeam);
785

    
786
    	Assert.assertEquals("", "Euphorbia atropurpurea Excomb ex Combauthor f. atropurpurea", name.getTitleCache());
787
    }
788

    
789
    @Test //#6656
790
    public void testAutonymHybrids(){
791
        IBotanicalName name = TaxonNameFactory.NewBotanicalInstance(Rank.SUBSPECIES());
792
        name.setGenusOrUninomial("Ophrys");
793
        name.setSpecificEpithet("kastelli");
794
        name.setInfraSpecificEpithet("kastelli");
795
        Team combTeam = Team.NewTitledInstance("E. Klein", "E. Klein");
796
        name.setCombinationAuthorship(combTeam);
797
        name.setBinomHybrid(true);
798
        name.setTrinomHybrid(true);
799

    
800
        String expected = String.format("Ophrys %skastelli E. Klein nothosubsp. kastelli", UTF8.HYBRID.toString());
801
        Assert.assertEquals("", expected, name.getTitleCache());
802
    }
803
}
(3-3/6)