package org.jf.smalidea.findUsages;

import com.intellij.usages.impl.rules.UsageType;

public class FieldUsageTypeTest extends UsageTypeTest {
    public FieldUsageTypeTest() {
        super(new SmaliUsageTypeProvider());
    }

    public void testFieldUsageTypes() throws Exception {
        doTest("blah.smali", "" +
                        ".class public Lblah;\n" +
                        ".super Ljava/lang/Object;\n" +
                        "\n" +
                        ".annotation runtime Lblah;\n" +
                        "    element = Lblah;->bl<ref:1>ah:Lblah;\n" +
                        "    element2 = .enum Lblah;->bl<ref:2>ah:Lblah;\n" +
                        ".end annotation\n" +
                        "\n" +
                        ".field public blah:Lblah;\n" +
                        "\n" +
                        ".method public blah(Lblah;)Lblah;\n" +
                        "    .registers 2\n" +
                        "\n" +
                        "    iget v0, v0, Lblah;->bl<ref:3>ah:Lblah;\n" +
                        "    iget-object v0, v0, Lblah;->bl<ref:4>ah:Lblah;\n" +
                        "    iget-byte v0, v0, Lblah;->bl<ref:5>ah:Lblah;\n" +
                        "    iget-char v0, v0, Lblah;->bl<ref:6>ah:Lblah;\n" +
                        "    iget-object v0, v0, Lblah;->bl<ref:7>ah:Lblah;\n" +
                        "    iget-object-volatile v0, v0, Lblah;->bl<ref:8>ah:Lblah;\n" +
                        "    iget-short v0, v0, Lblah;->bl<ref:9>ah:Lblah;\n" +
                        "    iget-volatile v0, v0, Lblah;->bl<ref:10>ah:Lblah;\n" +
                        "    iget-wide v0, v0, Lblah;->bl<ref:11>ah:Lblah;\n" +
                        "    iget-wide-volatile v0, v0, Lblah;->bl<ref:12>ah:Lblah;\n" +
                        "    sget v0, Lblah;->bl<ref:13>ah:Lblah;\n" +
                        "    sget-boolean v0, Lblah;->bl<ref:14>ah:Lblah;\n" +
                        "    sget-byte v0, Lblah;->bl<ref:15>ah:Lblah;\n" +
                        "    sget-char v0, Lblah;->bl<ref:16>ah:Lblah;\n" +
                        "    sget-object v0, Lblah;->bl<ref:17>ah:Lblah;\n" +
                        "    sget-object-volatile v0, Lblah;->bl<ref:18>ah:Lblah;\n" +
                        "    sget-short v0, Lblah;->bl<ref:19>ah:Lblah;\n" +
                        "    sget-volatile v0, Lblah;->bl<ref:20>ah:Lblah;\n" +
                        "    sget-wide v0, Lblah;->bl<ref:21>ah:Lblah;\n" +
                        "    sget-wide-volatile v0, Lblah;->bl<ref:22>ah:Lblah;\n" +
                        "    \n" +
                        "    iput v0, v0, Lblah;->bl<ref:23>ah:Lblah;\n" +
                        "    iput-object v0, v0, Lblah;->bl<ref:24>ah:Lblah;\n" +
                        "    iput-byte v0, v0, Lblah;->bl<ref:25>ah:Lblah;\n" +
                        "    iput-char v0, v0, Lblah;->bl<ref:26>ah:Lblah;\n" +
                        "    iput-object v0, v0, Lblah;->bl<ref:27>ah:Lblah;\n" +
                        "    iput-object-volatile v0, v0, Lblah;->bl<ref:28>ah:Lblah;\n" +
                        "    iput-short v0, v0, Lblah;->bl<ref:29>ah:Lblah;\n" +
                        "    iput-volatile v0, v0, Lblah;->bl<ref:30>ah:Lblah;\n" +
                        "    iput-wide v0, v0, Lblah;->bl<ref:31>ah:Lblah;\n" +
                        "    iput-wide-volatile v0, v0, Lblah;->bl<ref:32>ah:Lblah;\n" +
                        "    sput v0, Lblah;->bl<ref:33>ah:Lblah;\n" +
                        "    sput-boolean v0, Lblah;->bl<ref:34>ah:Lblah;\n" +
                        "    sput-byte v0, Lblah;->bl<ref:35>ah:Lblah;\n" +
                        "    sput-char v0, Lblah;->bl<ref:36>ah:Lblah;\n" +
                        "    sput-object v0, Lblah;->bl<ref:37>ah:Lblah;\n" +
                        // TODO: sput object volatile is no longer supported at default api level,
                        // thus disable his usage until Smalidea supports to define an api level
                        // "    sput-object-volatile v0, Lblah;->bl<ref:38>ah:Lblah;\n" +
                        "    sput-short v0, Lblah;->bl<ref:39>ah:Lblah;\n" +
                        "    sput-volatile v0, Lblah;->bl<ref:40>ah:Lblah;\n" +
                        "    sput-wide v0, Lblah;->bl<ref:41>ah:Lblah;\n" +
                        "    sput-wide-volatile v0, Lblah;->bl<ref:42>ah:Lblah;\n" +
                        "\n" +
                        "    throw-verification-error generic-error, Lblah;->bl<ref:43>ah:Lblah;\n" +
                        "\n" +
                        "    return-void\n" +
                        ".end method\n",
                1, SmaliUsageTypeProvider.LITERAL,
                2, SmaliUsageTypeProvider.LITERAL,
                3, UsageType.READ,
                4, UsageType.READ,
                5, UsageType.READ,
                6, UsageType.READ,
                7, UsageType.READ,
                8, UsageType.READ,
                9, UsageType.READ,
                10, UsageType.READ,
                11, UsageType.READ,
                12, UsageType.READ,
                13, UsageType.READ,
                14, UsageType.READ,
                15, UsageType.READ,
                16, UsageType.READ,
                17, UsageType.READ,
                18, UsageType.READ,
                19, UsageType.READ,
                20, UsageType.READ,
                21, UsageType.READ,
                22, UsageType.READ,
                23, UsageType.WRITE,
                24, UsageType.WRITE,
                25, UsageType.WRITE,
                26, UsageType.WRITE,
                27, UsageType.WRITE,
                28, UsageType.WRITE,
                29, UsageType.WRITE,
                30, UsageType.WRITE,
                31, UsageType.WRITE,
                32, UsageType.WRITE,
                33, UsageType.WRITE,
                34, UsageType.WRITE,
                35, UsageType.WRITE,
                36, UsageType.WRITE,
                37, UsageType.WRITE,
                // TODO: sput object volatile is no longer supported at default api level,
                // thus disable his usage until Smalidea supports to define an api level
                //38, UsageType.WRITE,
                39, UsageType.WRITE,
                40, UsageType.WRITE,
                41, UsageType.WRITE,
                42, UsageType.WRITE,
                43, SmaliUsageTypeProvider.VERIFICATION_ERROR);
    }
}
