Identifier.ceylon

import ceylon.ast.core {
    LIdentifier,
    UIdentifier
}
import ceylon.ast.create {
    createIdentifier=identifier
}
import ceylon.test {
    test,
    assertEquals,
    assertFalse,
    assertTrue
}

test
shared void identifier() {
    value lid = createIdentifier("lid");
    value uid = createIdentifier("Uid");
    value lidf = createIdentifier("\\iLid");
    value uidf = createIdentifier("\\Iuid");
    value lidp = createIdentifier("\\ilid");
    value uidp = createIdentifier("\\IUid");
    
    assertEquals(lid, LIdentifier("lid"), "parse LIdentifier");
    assertEquals(uid, UIdentifier("Uid"), "parse UIdentifier");
    assertEquals(lidf, LIdentifier("Lid", true), "parse forced LIdentifier");
    assertEquals(uidf, UIdentifier("uid", true), "parse forced UIdentifier");
    assertEquals(lidp, LIdentifier("lid", true), "parse LIdentifier with unnecessary prefix");
    assertEquals(uidp, UIdentifier("Uid", true), "parse UIdentifier with unnecessary prefix");
    
    assertFalse(lid.usePrefix, "regular LIdentifier has no prefix");
    assertFalse(uid.usePrefix, "regular UIdentifier has no prefix");
    assertTrue(lidf.usePrefix, "forced LIdentifier has prefix");
    assertTrue(uidf.usePrefix, "forced UIdentifier has prefix");
    assertTrue(lidp.usePrefix, "LIdentifier with unnecessary prefix keeps prefix");
    assertTrue(uidp.usePrefix, "UIdentifier with unnecessary prefix keeps prefix");
    
    for (text in { "lid", "Uid", "\\iLid", "\\Iuid", "\\ilid", "\\IUid" }) {
        assertEquals(createIdentifier(text).text, text, "text of identifier parsed from '``text``'");
        assertEquals(createIdentifier(createIdentifier(text).text), createIdentifier(text), "identifier parsed from text of identifier parsed from '``text``'");
    }
}