Project

General

Profile

Download (40.4 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.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 = Logger.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
    //#9754
286
    @Test
287
    public void testCultivar(){
288

    
289
        //cultivar
290
        speciesName.setRank(Rank.CULTIVAR());
291
        speciesName.setCultivarName("Cultus");
292
        Assert.assertEquals("Abies alba 'Cultus'", strategy.getTitleCache(speciesName));
293

    
294
        speciesName.setBinomHybrid(true);
295
        Assert.assertEquals("Abies \u00D7alba 'Cultus'", strategy.getTitleCache(speciesName));
296

    
297
        speciesName.setBinomHybrid(false);
298
        speciesName.setSpecificEpithet(null);
299
        Assert.assertEquals("Abies 'Cultus'", strategy.getTitleCache(speciesName));
300

    
301
        //cultivar group
302
        speciesName.setRank(Rank.CULTIVARGROUP());
303
        Assert.assertEquals("Abies Group", strategy.getTitleCache(speciesName)); //not sure if this is correct for an empty group field
304
        speciesName.setCultivarGroup("Cultus Group");
305
        Assert.assertEquals("Abies Cultus Group", strategy.getTitleCache(speciesName));
306

    
307
        speciesName.setCultivarGroup("Cultus Gruppe");
308
        Assert.assertEquals("Abies Cultus Gruppe", strategy.getTitleCache(speciesName));
309
        speciesName.setCultivarGroup("Cultus Gp");
310
        Assert.assertEquals("Abies Cultus Gp", strategy.getTitleCache(speciesName));
311
        speciesName.setCultivarGroup("Gruppo Cultus");
312
        Assert.assertEquals("Abies Gruppo Cultus", strategy.getTitleCache(speciesName));
313
        speciesName.setCultivarGroup("Druppo Cultus");
314
        Assert.assertEquals("Abies Druppo Cultus Group", strategy.getTitleCache(speciesName));
315

    
316
        //grex
317
        speciesName.setRank(Rank.GREX());
318
        speciesName.setCultivarGroup("Lovely");
319
        Assert.assertEquals("Abies Lovely grex", strategy.getTitleCache(speciesName));
320

    
321
        //graft chimaera
322
        //https://en.wikipedia.org/wiki/Graft-chimaera
323
        //either formula (like hybrids) concatenated by ' + ' (Art. 24.2)
324
        speciesName.setRank(Rank.GRAFTCHIMAERA());
325
        speciesName.setGenusOrUninomial("Laburnocytisus");
326
        speciesName.setCultivarName("Adamii");
327

    
328
        Assert.assertEquals("+ Laburnocytisus 'Adamii'", strategy.getTitleCache(speciesName));
329
    }
330

    
331
    //3665
332
    @Test
333
    public void testOriginalSpelling() {
334

    
335
        TaxonName originalName = speciesName.clone();
336
    	originalName.setSpecificEpithet("alpa");
337
    	Assert.assertEquals("Preconditions are wrong", "Abies alpa", originalName.getTitleCache());
338
        Assert.assertEquals("Name cache should not show original spelling", "Abies alpa", originalName.getNameCache());
339

    
340
    	speciesName.setOriginalSpelling(originalName);
341
    	Assert.assertEquals("Abies alba [as \"alpa\"]", speciesName.getFullTitleCache());
342
        Assert.assertEquals("Abies alba", speciesName.getTitleCache());
343
        Assert.assertEquals("Name cache should not show original spelling", "Abies alba", speciesName.getNameCache());
344

    
345
    	originalName.setGenusOrUninomial("Apies");
346
    	speciesName.setFullTitleCache(null, false);
347
    	originalName.setNameCache(null, false);
348
    	//TODO update cache of current name (species name)
349
    	Assert.assertEquals("Abies alba [as \"Apies alpa\"]", speciesName.getFullTitleCache());
350
        Assert.assertEquals("Abies alba", speciesName.getTitleCache());
351
        Assert.assertEquals("Name cache should not show original spelling", "Abies alba", speciesName.getNameCache());
352
        originalName.setSpecificEpithet("alba");
353
        originalName.setNameCache(null, false);
354
        speciesName.setFullTitleCache(null, false);
355
        //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
356
        Assert.assertEquals("Abies alba [as \"Apies\"]", speciesName.getFullTitleCache());
357

    
358
        //subspecies
359
        originalName = subSpeciesName.clone();
360
        originalName.setInfraSpecificEpithet("peta");
361
        Assert.assertEquals("Preconditions are wrong", "Abies alba subsp. peta", originalName.getTitleCache());
362
        subSpeciesName.setOriginalSpelling(originalName);
363
        Assert.assertEquals("Abies alba subsp. beta [as \"peta\"]", subSpeciesName.getFullTitleCache());
364
        Assert.assertEquals("Abies alba subsp. beta", subSpeciesName.getTitleCache());
365
        originalName.setSpecificEpithet("alpa");
366
        originalName.setNameCache(null, false);
367
        subSpeciesName.setFullTitleCache(null, false);
368
        Assert.assertEquals("Abies alba subsp. beta [as \"alpa subsp. peta\"]", subSpeciesName.getFullTitleCache());
369

    
370
        originalName.setInfraSpecificEpithet("beta");
371
        originalName.setNameCache(null, false);
372
        subSpeciesName.setFullTitleCache(null, false);
373
        //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
374
        Assert.assertEquals("Abies alba subsp. beta [as \"alpa\"]", subSpeciesName.getFullTitleCache());
375

    
376
    	INonViralName correctName = NonViralNameParserImpl.NewInstance().parseFullName("Nepenthes glabrata J.R.Turnbull & A.T.Middleton");
377
    	TaxonName originalSpelling = (TaxonName)NonViralNameParserImpl.NewInstance().parseFullName("Nepenthes glabratus");
378
    	correctName.setOriginalSpelling(originalSpelling);
379
    	Assert.assertEquals("Nepenthes glabrata", correctName.getNameCache());
380
    	Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton", correctName.getTitleCache());
381
    	Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton [as \"glabratus\"]", correctName.getFullTitleCache());
382

    
383
    	correctName.setNomenclaturalReference(citationRef);
384
        Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton, My Reference [as \"glabratus\"]", correctName.getFullTitleCache());
385
        citationRef.setProtectedTitleCache(false);
386
        citationRef.setTitle("Sp. Pl.");
387
        citationRef.setDatePublished(TimePeriodParser.parseStringVerbatim("1988"));
388
        correctName.setFullTitleCache(null, false);
389
        Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton, Sp. Pl. 1988 [as \"glabratus\"]", correctName.getFullTitleCache());
390
        correctName.addStatus(NomenclaturalStatus.NewInstance(NomenclaturalStatusType.ILLEGITIMATE()));
391
        correctName.setFullTitleCache(null, false);
392
        Assert.assertEquals("Nepenthes glabrata J.R.Turnbull & A.T.Middleton, Sp. Pl. 1988 [as \"glabratus\"], nom. illeg.", correctName.getFullTitleCache());
393
    }
394

    
395
    //3667
396
    @Test
397
    public void testOriginalSpellingItalics() {
398

    
399
        TaxonName originalName = subSpeciesName.clone();
400
        originalName.setSpecificEpithet("alpa");
401
        Assert.assertEquals("Preconditions are wrong", "Abies alpa subsp. beta", originalName.getTitleCache());
402

    
403
        subSpeciesName.setOriginalSpelling(originalName);
404

    
405
        List<TaggedText> taggedFullTitle = subSpeciesName.getCacheStrategy().getTaggedFullTitle(subSpeciesName);
406
        Assert.assertEquals(7, taggedFullTitle.size());
407
        Assert.assertEquals(new TaggedText(TagEnum.name, "Abies"), taggedFullTitle.get(0));
408
        Assert.assertEquals(new TaggedText(TagEnum.name, "alba"), taggedFullTitle.get(1));
409
        Assert.assertEquals(new TaggedText(TagEnum.rank, "subsp."), taggedFullTitle.get(2));
410
        Assert.assertEquals(new TaggedText(TagEnum.name, "beta"), taggedFullTitle.get(3));
411
        Assert.assertEquals(new TaggedText(TagEnum.separator, " [as \""), taggedFullTitle.get(4));
412
        Assert.assertEquals(new TaggedText(TagEnum.name, "alpa"), taggedFullTitle.get(5));
413
        Assert.assertEquals(new TaggedText(TagEnum.separator, "\"]"), taggedFullTitle.get(6));
414

    
415
        originalName.setInfraSpecificEpithet("peta");
416
        originalName.setNameCache(null, false);
417
        taggedFullTitle = subSpeciesName.getCacheStrategy().getTaggedFullTitle(subSpeciesName);
418
        Assert.assertEquals(9, taggedFullTitle.size());
419
        Assert.assertEquals(new TaggedText(TagEnum.name, "alba"), taggedFullTitle.get(1));
420
        Assert.assertEquals(new TaggedText(TagEnum.name, "Abies"), taggedFullTitle.get(0));
421
        Assert.assertEquals(new TaggedText(TagEnum.name, "alba"), taggedFullTitle.get(1));
422
        Assert.assertEquals(new TaggedText(TagEnum.rank, "subsp."), taggedFullTitle.get(2));
423
        Assert.assertEquals(new TaggedText(TagEnum.name, "beta"), taggedFullTitle.get(3));
424
        Assert.assertEquals(new TaggedText(TagEnum.separator, " [as \""), taggedFullTitle.get(4));
425
        Assert.assertEquals(new TaggedText(TagEnum.name, "alpa"), taggedFullTitle.get(5));
426
        Assert.assertEquals(new TaggedText(TagEnum.rank, "subsp."), taggedFullTitle.get(6));
427
        Assert.assertEquals(new TaggedText(TagEnum.name, "peta"), taggedFullTitle.get(7));
428
        Assert.assertEquals(new TaggedText(TagEnum.separator, "\"]"), taggedFullTitle.get(8));
429
    }
430

    
431
    @Test
432
    public void testCacheListener() {
433
        Reference ref = ReferenceFactory.newGeneric();
434
        ref.setTitleCache("GenericRef",true);
435
        this.subSpeciesName.setNomenclaturalReference(ref);
436
        Assert.assertEquals("Expected full title cache has error", "Abies alba subsp. beta, GenericRef", subSpeciesName.getFullTitleCache());
437
        subSpeciesName.setCombinationAuthorship(author);
438
        subSpeciesName.setBasionymAuthorship(basAuthor);
439
        Assert.assertEquals("Expected full title cache has error", "Abies alba subsp. beta (Basio, A.) L., GenericRef", subSpeciesName.getFullTitleCache());
440
        //cascade name change to fullTitleCache
441
        subSpeciesName.setRank(Rank.SPECIES());
442
        subSpeciesName.setProtectedNameCache(true);
443
        Assert.assertNull("name cache should be null", subSpeciesName.getNameCache());
444
        subSpeciesName.setProtectedNameCache(false);
445
        Assert.assertNotNull("name cache should not be null", subSpeciesName.getNameCache());
446
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L., GenericRef", subSpeciesName.getFullTitleCache());
447
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L.", subSpeciesName.getTitleCache());
448
        Assert.assertEquals("Expected full title cache has error", "Abies alba", subSpeciesName.getNameCache());
449

    
450
        subSpeciesName.setProtectedNameCache(true);
451
        subSpeciesName.setSpecificEpithet("gamma");
452
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L., GenericRef", subSpeciesName.getFullTitleCache());
453
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L.", subSpeciesName.getTitleCache());
454
        Assert.assertEquals("Expected full title cache has error", "Abies alba", subSpeciesName.getNameCache());
455
        //make original status
456
        subSpeciesName.setRank(Rank.SUBSPECIES());
457
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) L., GenericRef", subSpeciesName.getFullTitleCache());
458

    
459
        //author change
460
        author.setNomenclaturalTitleCache("M.", true);
461
        Assert.assertEquals("Expected full title cache has error", "(Basio, A.) M.", subSpeciesName.getAuthorshipCache());
462
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
463
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) M.", subSpeciesName.getTitleCache());
464

    
465
        //protectedTitleCache
466
        subSpeciesName.setProtectedTitleCache(true);
467
        subSpeciesName.setProtectedNameCache(false);
468
        subSpeciesName.setGenusOrUninomial("Pinus");
469
        subSpeciesName.setSpecificEpithet("alba");
470
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta", subSpeciesName.getNameCache());
471
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
472
        Assert.assertEquals("Expected full title cache has error", "Abies alba (Basio, A.) M.", subSpeciesName.getTitleCache());
473

    
474
        subSpeciesName.setTitleCache("Pinus beta C.", true);
475
        Assert.assertEquals("Expected full title cache has error", "Pinus beta C., GenericRef", subSpeciesName.getFullTitleCache());
476
        subSpeciesName.setProtectedTitleCache(false);
477

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

    
480
        //protected full title cache set
481
        subSpeciesName.setFullTitleCache("ABC");
482
        Assert.assertEquals("Expected full title cache has error", "ABC", subSpeciesName.getFullTitleCache());
483
        subSpeciesName.setProtectedFullTitleCache(false);
484
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
485

    
486
        //protected title cache set
487
        subSpeciesName.setProtectedTitleCache(false);
488
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
489

    
490
        //protectedNameCache set
491
        subSpeciesName.setProtectedNameCache(true);
492
        Assert.assertEquals("Expected full title cache has error", "Pinus alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
493
        subSpeciesName.setNameCache("P. alba subsp. beta");
494
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
495

    
496
        subSpeciesName.setGenusOrUninomial("A.");
497
        subSpeciesName.setProtectedNameCache(false);
498
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
499
        subSpeciesName.setNameCache("P. alba subsp. beta");
500
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
501

    
502
        //protected authorship
503
        subSpeciesName.setProtectedAuthorshipCache(true);
504
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta (Basio, A.) M., GenericRef", subSpeciesName.getFullTitleCache());
505
        subSpeciesName.setAuthorshipCache("Ciard.");
506
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta Ciard., GenericRef", subSpeciesName.getFullTitleCache());
507

    
508
        author.setNomenclaturalTitleCache("X.", true);
509
        subSpeciesName.setProtectedAuthorshipCache(false);
510
        Assert.assertEquals("Expected full title cache has error", "P. alba subsp. beta (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
511

    
512
        //clear
513
        subSpeciesName.setProtectedNameCache(false);
514
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
515

    
516
        //appended phrase
517
        subSpeciesName.setProtectedNameCache(true);
518
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
519
        subSpeciesName.setAppendedPhrase("app phrase");
520
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
521
        subSpeciesName.setProtectedNameCache(false);
522
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta app phrase (Basio, A.) X., GenericRef", subSpeciesName.getFullTitleCache());
523
        subSpeciesName.setAppendedPhrase("app2 phrase2");
524
        subSpeciesName.setProtectedNameCache(true);
525
        Assert.assertNull("NameCache should be null", subSpeciesName.getNameCache());
526
        subSpeciesName.setProtectedNameCache(false);
527
        subSpeciesName.setAppendedPhrase(null);
528

    
529
        //ref + nomRef
530
        Reference book = ReferenceFactory.newBook();
531
        book.setTitle("Booktitle");
532
        Assert.assertNotNull("TitleCache should not be null", subSpeciesName.getTitleCache());
533
        subSpeciesName.setNomenclaturalReference(book);
534
        subSpeciesName.setNomenclaturalMicroReference("22");
535
        Assert.assertEquals("Expected full title cache has error", "A. alba subsp. beta (Basio, A.) X., Booktitle: 22", subSpeciesName.getFullTitleCache());
536
        subSpeciesName.setProtectedTitleCache(true);
537
        Assert.assertNotNull("TitleCache should not be null", subSpeciesName.getTitleCache());
538

    
539
        //year
540
        IZoologicalName zooName = TaxonNameFactory.NewZoologicalInstance(Rank.SPECIES());
541
        zooName.setGenusOrUninomial("Homo");
542
        zooName.setSpecificEpithet("sapiens");
543
        zooName.setBasionymAuthorship(basAuthor);
544
        zooName.setCombinationAuthorship(author);
545
        zooName.setNomenclaturalReference(book);
546
        zooName.setNomenclaturalMicroReference("22");
547
        Assert.assertEquals("Expected full title cache has error", "Homo sapiens (Basio, A.) X., Booktitle: 22", zooName.getFullTitleCache());
548

    
549
        zooName.setOriginalPublicationYear(1922);
550
        zooName.setPublicationYear(1948);
551
        Assert.assertEquals("Expected full title cache has error", "Homo sapiens (Basio, A., 1922) X., 1948, Booktitle: 22", zooName.getFullTitleCache());
552
        zooName.setOriginalPublicationYear(1923);
553
        zooName.setProtectedAuthorshipCache(true);
554
        Assert.assertNull("AuthorshipCache should be null", zooName.getAuthorshipCache());
555
        zooName.setProtectedAuthorshipCache(false);
556
        Assert.assertNotNull("AuthorshipCache should not be null", zooName.getAuthorshipCache());
557
        zooName.setPublicationYear(1949);
558
        zooName.setProtectedAuthorshipCache(true);
559
        Assert.assertNull("AuthorshipCache should be null", zooName.getAuthorshipCache());
560

    
561
    }
562

    
563
    @Test
564
    public void testGetSetNameAuthorSeperator() {
565
        String authorSeparator = "authorSeparator";
566
        strategy.setNameAuthorSeperator(authorSeparator);
567
        assertEquals(authorSeparator, strategy.getNameAuthorSeperator());
568
        strategy.setNameAuthorSeperator(null);
569
        assertNull(strategy.getNameAuthorSeperator());
570
    }
571

    
572
    @Test
573
    public void testGetSetBasionymStart() {
574
        String basStart = "start";
575
        strategy.setBasionymStart(basStart);
576
        assertEquals(basStart, strategy.getBasionymStart());
577
        strategy.setBasionymStart(null);
578
        assertNull(strategy.getBasionymStart());
579
    }
580

    
581
    @Test
582
    public void testGetSetBasionymEnd() {
583
        String basEnd = "end";
584
        strategy.setBasionymEnd(basEnd);
585
        assertEquals(basEnd, strategy.getBasionymEnd());
586
        strategy.setBasionymEnd(null);
587
        assertNull(strategy.getBasionymEnd());
588
    }
589

    
590
    @Test
591
    public void testGetSetExAuthorSeperator() {
592
        String exAuthorSeparator = "exAuthorSeparator";
593
        strategy.setExAuthorSeperator(exAuthorSeparator);
594
        assertEquals(exAuthorSeparator, strategy.getExAuthorSeperator());
595
        strategy.setExAuthorSeperator(null);
596
        assertNull(strategy.getExAuthorSeperator());
597
    }
598

    
599
    @Test
600
    public void testSetBasionymAuthorCombinationAuthorSeperator() {
601
        String basComSeparator = "basComSeparator";
602
        strategy.setBasionymAuthorCombinationAuthorSeperator(basComSeparator);
603
        assertEquals(basComSeparator, strategy.getBasionymAuthorCombinationAuthorSeperator());
604
        strategy.setBasionymAuthorCombinationAuthorSeperator(null);
605
        assertNull(strategy.getBasionymAuthorCombinationAuthorSeperator());
606
    }
607

    
608
    @Test
609
    public void testGetInfraGenericNames(){
610
        String author = "Anyauthor";
611
        TaxonName nonViralName = TaxonNameFactory.NewNonViralInstance(Rank.SUBGENUS());
612
        nonViralName.setGenusOrUninomial("Genus");
613
        nonViralName.setInfraGenericEpithet("subgenus");
614
        nonViralName.setAuthorshipCache(author);
615

    
616
        //test ordinary infrageneric
617
        List<TaggedText> subGenusNameCacheTagged = strategy.getInfraGenusTaggedNameCache(nonViralName);
618
        String subGenusNameCache = TaggedCacheHelper.createString(subGenusNameCacheTagged);
619
        assertEquals("Subgenus name should be 'Genus subg. subgenus'.", "Genus subg. subgenus", subGenusNameCache);
620
        String subGenusTitle = strategy.getTitleCache(nonViralName);
621
        assertEquals("Subgenus name should be 'Genus subg. subgenus Anyauthor'.", "Genus subg. subgenus Anyauthor", subGenusTitle);
622

    
623
        //test species aggregates and species groups
624
        nonViralName.setRank(Rank.SPECIESAGGREGATE());
625
        nonViralName.setSpecificEpithet("myspecies");
626
        nonViralName.setInfraGenericEpithet(null);
627
        nonViralName.setAuthorshipCache(null);
628

    
629
        List<TaggedText> aggrNameCacheTagged = strategy.getInfraGenusTaggedNameCache(nonViralName);
630

    
631
        String aggrNameCache = TaggedCacheHelper.createString(aggrNameCacheTagged);
632
        assertEquals("Species aggregate name should be 'Genus myspecies aggr.'.", "Genus myspecies aggr.", aggrNameCache);
633
        String aggrNameTitle = strategy.getTitleCache(nonViralName);
634
        Assert.assertTrue("Species aggregate should not include author information.", aggrNameTitle.indexOf(author) == -1);
635
        assertEquals("Species aggregate name should be 'Genus myspecies aggr.'.", "Genus myspecies aggr.", aggrNameTitle);
636
        nonViralName.setRank(Rank.SPECIESGROUP());
637
        String groupNameTitle = strategy.getTitleCache(nonViralName);
638
        assertEquals("Species group name should be 'Genus myspecies species group'.", "Genus myspecies species group", groupNameTitle);
639

    
640
        //test species aggregates and species groups with infrageneric information
641
        //TODO check if groups do ever have infrageneric epithets
642
        nonViralName.setRank(Rank.SPECIESAGGREGATE());
643
        nonViralName.setSpecificEpithet("myspecies");
644
        nonViralName.setInfraGenericEpithet("Infragenus");
645

    
646
        aggrNameCacheTagged = strategy.getInfraGenusTaggedNameCache(nonViralName);
647
        aggrNameCache = TaggedCacheHelper.createString(aggrNameCacheTagged);
648
        assertEquals("Species aggregate name should be 'Genus (Infragenus) myspecies aggr.'.", "Genus (Infragenus) myspecies aggr.", aggrNameCache);
649

    
650
        aggrNameTitle = strategy.getTitleCache(nonViralName);
651
        Assert.assertTrue("Species aggregate should not include author information.", aggrNameTitle.indexOf(author) == -1);
652
        assertEquals("Species aggregate name should be 'Genus (Infragenus) myspecies aggr.'.", "Genus (Infragenus) myspecies aggr.", aggrNameTitle);
653

    
654
        nonViralName.setRank(Rank.SPECIESGROUP());
655
        groupNameTitle = strategy.getTitleCache(nonViralName);
656
        assertEquals("Species group name should be 'Genus (Infragenus) myspecies species group'.", "Genus (Infragenus) myspecies species group", groupNameTitle);
657

    
658
        //aggregates with author and nom.ref. information #4288
659
        nonViralName.setRank(Rank.SPECIESAGGREGATE());
660
        nonViralName.setSpecificEpithet("myspecies");
661
        nonViralName.setInfraGenericEpithet(null);
662
        nonViralName.setAuthorshipCache("L.");
663

    
664
        aggrNameCacheTagged = strategy.getTaggedTitle(nonViralName);
665
        aggrNameCache = TaggedCacheHelper.createString(aggrNameCacheTagged);
666
        assertEquals("Species aggregate name should be 'Genus myspecies L.'.", "Genus myspecies L.", aggrNameCache);
667

    
668
    }
669

    
670
    @Test
671
    public void testGetTaggedNameSpeciesAggregate() {
672
        TaxonName speciesAggregate = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIESAGGREGATE());
673
        speciesAggregate.setGenusOrUninomial("Mygenus");
674
        speciesAggregate.setSpecificEpithet("myspecies");
675
        List<TaggedText> taggedName = strategy.getTaggedName(speciesAggregate);
676
        Assert.assertEquals("1rd tag must be genus epithet", "Mygenus", taggedName.get(0).getText());
677
        Assert.assertEquals("2rd tag must be species epithet", "myspecies", taggedName.get(1).getText());
678
        Assert.assertEquals("3rd tag must be aggregate marker", "aggr.",taggedName.get(2).getText());
679
    }
680

    
681
    @Test
682
    public void testGetTaggedNameSubspecies(){
683
        List<TaggedText> taggedName = strategy.getTaggedName(subSpeciesName);
684
        Assert.assertEquals("First tag should be 'Abies'", "Abies", taggedName.get(0).getText());
685
        Assert.assertEquals("Second tag should be 'alba'", "alba", taggedName.get(1).getText());
686
        Assert.assertEquals("Third tag should be subspecies rank, and rank abbreviatioin should be subsp.", "subsp.", taggedName.get(2).getText());
687
        Assert.assertEquals("Fourth tag should be 'beta'", "beta", taggedName.get(3).getText());
688
        //to be continued
689
    }
690

    
691
    @Test
692
    public void testTitleCacheHtmlTagged(){
693
    	HTMLTagRules rules = new HTMLTagRules().addRule(TagEnum.name, "i");
694
    	Assert.assertEquals("<i>Abies alba</i>", strategy.getTitleCache(speciesName, rules));
695
    	rules.addRule(TagEnum.name, "b");
696
    	Assert.assertEquals("<b><i>Abies alba</i></b>", strategy.getTitleCache(speciesName, rules));
697
    	speciesName.setCombinationAuthorship(author);
698
    	Assert.assertEquals("<b><i>Abies alba</i></b> L.", strategy.getTitleCache(speciesName, rules));
699
    	rules.addRule(TagEnum.authors, "i");
700
    	Assert.assertEquals("<b><i>Abies alba</i></b> <i>L.</i>", strategy.getTitleCache(speciesName, rules));
701
    	rules = new HTMLTagRules().addRule(TagEnum.name, "i").addRule(TagEnum.name, "b").addRule(TagEnum.authors, "b");
702
    	Assert.assertEquals("<b><i>Abies alba</i> L.</b>", strategy.getTitleCache(speciesName, rules));
703
    }
704

    
705
    @Test //#2888
706
    public void testAutonymWithExAuthor(){
707
    	IBotanicalName name = TaxonNameFactory.NewBotanicalInstance(Rank.FORM());
708
    	name.setGenusOrUninomial("Euphorbia");
709
    	name.setSpecificEpithet("atropurpurea");
710
    	name.setInfraSpecificEpithet("atropurpurea");
711
    	Team combTeam = Team.NewTitledInstance("Combauthor", "Combauthor");
712
    	name.setCombinationAuthorship(combTeam);
713
    	Team exCombTeam = Team.NewTitledInstance("Excomb", "Excomb");
714
    	name.setExCombinationAuthorship(exCombTeam);
715

    
716
    	Assert.assertEquals("", "Euphorbia atropurpurea Excomb ex Combauthor f. atropurpurea", name.getTitleCache());
717
    }
718

    
719
    @Test //#6656
720
    public void testAutonymHybrids(){
721
        IBotanicalName name = TaxonNameFactory.NewBotanicalInstance(Rank.SUBSPECIES());
722
        name.setGenusOrUninomial("Ophrys");
723
        name.setSpecificEpithet("kastelli");
724
        name.setInfraSpecificEpithet("kastelli");
725
        Team combTeam = Team.NewTitledInstance("E. Klein", "E. Klein");
726
        name.setCombinationAuthorship(combTeam);
727
        name.setBinomHybrid(true);
728
        name.setTrinomHybrid(true);
729

    
730
        String expected = String.format("Ophrys %skastelli E. Klein nothosubsp. kastelli", UTF8.HYBRID.toString());
731
        Assert.assertEquals("", expected, name.getTitleCache());
732
    }
733
}
(3-3/6)