Back to Repositories

Validating AccessInfo Visibility Controls in JADX

This test suite validates the AccessInfo class functionality in the JADX decompiler, focusing on visibility modifiers and access flag management. The tests ensure proper handling of Java access level modifications and static method attributes.

Test Coverage Overview

The test suite provides comprehensive coverage of AccessInfo class operations, particularly focusing on visibility modifier changes.

Key areas tested include:
  • Visibility modifier transitions (protected to public)
  • Static flag preservation during modifications
  • No-op scenarios for unchanged visibility
  • Access flag bit manipulation integrity

Implementation Analysis

The testing approach utilizes JUnit Jupiter for structured unit testing, with custom assertions for JADX-specific validations. The implementation employs the AssertJ fluent assertion library combined with custom JadxAssertions for enhanced verification capabilities.

Testing patterns include:
  • Direct state verification through boolean checks
  • Object reference comparison for optimization cases
  • Bitwise operation validation for access flags

Technical Details

Testing infrastructure includes:
  • JUnit Jupiter test framework
  • AssertJ assertion library
  • Custom JadxAssertions for specialized checks
  • AccessFlags enumeration for flag management
  • AFType enumeration for method context specification

Best Practices Demonstrated

The test suite exemplifies several testing best practices in Java unit testing.

Notable practices include:
  • Clear test method naming reflecting functionality
  • Single responsibility per test case
  • Explicit state verification
  • Efficient use of custom assertion frameworks
  • Proper test isolation and setup

skylot/jadx

jadx-core/src/test/java/jadx/core/dex/info/AccessInfoTest.java

            
package jadx.core.dex.info;

import org.junit.jupiter.api.Test;

import jadx.api.plugins.input.data.AccessFlags;
import jadx.core.dex.info.AccessInfo.AFType;

import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat;
import static org.assertj.core.api.Assertions.assertThat;

public class AccessInfoTest {

	@Test
	public void changeVisibility() {
		AccessInfo accessInfo = new AccessInfo(AccessFlags.PROTECTED | AccessFlags.STATIC, AFType.METHOD);
		AccessInfo result = accessInfo.changeVisibility(AccessFlags.PUBLIC);

		assertThat(result.isPublic()).isTrue();
		assertThat(result.isPrivate()).isFalse();
		assertThat(result.isProtected()).isFalse();

		assertThat(result.isStatic()).isTrue();
	}

	@Test
	public void changeVisibilityNoOp() {
		AccessInfo accessInfo = new AccessInfo(AccessFlags.PUBLIC, AFType.METHOD);
		AccessInfo result = accessInfo.changeVisibility(AccessFlags.PUBLIC);
		assertThat(result).isSameAs(accessInfo);
	}
}