A compact fixture table keeps inputs and expected outputs side by side, then loops over the active cases.

Program

Play the program to choose how many cases from the table are included.

fixture_table.f90
program fixture_table_demo
    implicit none
    integer :: inputs(4)
    integer :: expected(4)
    integer :: active_cases
    integer :: i
    integer :: actual
    integer :: pass_count

    inputs = [1, 2, 3, 4]
    expected = [2, 4, 6, 9]
    active_cases = 
    pass_count = 0
    do i = 1, active_cases
        actual = inputs(i) * 2
        if (actual == expected(i)) pass_count = pass_count + 1
    end do
    print '(I0, 1X, I0)', pass_count, active_cases
end program fixture_table_demo
program fixture_table_demo
    implicit none
    integer :: inputs(4)
    integer :: expected(4)
    integer :: active_cases
    integer :: i
    integer :: actual
    integer :: pass_count

    inputs = [1, 2, 3, 4]
    expected = [2, 4, 6, 9]
    active_cases = 
    pass_count = 0
    do i = 1, active_cases
        actual = inputs(i) * 2
        if (actual == expected(i)) pass_count = pass_count + 1
    end do
    print '(I0, 1X, I0)', pass_count, active_cases
end program fixture_table_demo
program fixture_table_demo
    implicit none
    integer :: inputs(4)
    integer :: expected(4)
    integer :: active_cases
    integer :: i
    integer :: actual
    integer :: pass_count

    inputs = [1, 2, 3, 4]
    expected = [2, 4, 6, 9]
    active_cases = 
    pass_count = 0
    do i = 1, active_cases
        actual = inputs(i) * 2
        if (actual == expected(i)) pass_count = pass_count + 1
    end do
    print '(I0, 1X, I0)', pass_count, active_cases
end program fixture_table_demo
fixture table Inputs and expected results live in arrays with matching positions.
active cases `active_cases` lets a test run only a prefix of the table.
pass count Counting passes gives a small summary without invoking a test framework.