import java.util.Scanner;
import java.io.FileReader;
import java.io.IOException;

public class maze {
    static Scanner in;
    static int[] count;
    static int[] goodList;

    public static void main(String[] args) throws IOException {
        in = new Scanner(System.in);

        int t = in.nextInt();
        String[] results = new String[t];
        count = new int[t];
        goodList = new int[t];
        
        //INPUTS
        for(int i = 0; i < t; i++){
            int n = in.nextInt();
            int m = in.nextInt();
            char[][] matrix = new char[n][m];

            in.nextLine();

            //forms the matrix
            for(int j = 0; j < n; j++){
                String temp = in.nextLine();
                for(int k = 0; k < m; k++){
                    matrix[j][k] = temp.charAt(k);
                }
            }

            solve(i, n, m, matrix);
        }

        //COMPILING RESULTS
        for(int i = 0; i < t; i++){
            int anticipated = goodList[i];
            int got = count[i];

            if(got == -1){
                results[i] = "No";
                continue;
            }
            else if(got == anticipated){
                results[i] = "Yes";
                continue;
            }
            else {
                results[i] = "No";
                continue;
            }
        }

        //OUTPUT
        for(int i = 0; i < t; i++){
            System.out.println(results[i]);
        }
    }

    public static void solve(int t, int n, int m, char[][] matrix){
        int goodCount = 0;

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                char current = matrix[i][j];

                if(current == '.' || current == '#') continue;
                else if(current == 'G'){
                    goodCount++;
                    continue;
                }
                else if(current == 'B'){
                    //valid up
                    if(i - 1 >= 0 && matrix[i-1][j] != 'B' && matrix[i-1][j] != 'G') matrix[i-1][j] = '#';
                    //valid right
                    if(j + 1 < m && matrix[i][j+1] != 'B' && matrix[i][j+1] != 'G') matrix[i][j+1] = '#';
                    //valid down
                    if(i + 1 < n && matrix[i+1][j] != 'B' && matrix[i+1][j] != 'G') matrix[i+1][j] = '#';
                    //valid left
                    if(j - 1 >= 0 && matrix[i][j-1] != 'B' && matrix[i][j-1] != 'G') matrix[i][j-1] = '#';
                }
            }
        }

        goodList[t] = goodCount;
        floodfill(n-1, m-1, t, n, m, matrix);
    }

    public static void floodfill(int y, int z, int t, int n, int m, char[][] matrix){
        char current = matrix[y][z];
        if(current == '#') return;
        if(current == 'B'){
            count[t] = -1;
        }
        if(current == 'G'){
            if(count[t] >= 0) count[t] = count[t] + 1;
        }
        matrix[y][z] = '#';

        //up
        if(y - 1 >= 0) floodfill(y - 1, z, t, n, m, matrix);
        //down
        if(y + 1 < n) floodfill(y + 1, z, t, n, m, matrix);
        //left
        if(z - 1 >= 0) floodfill(y, z - 1, t, n, m, matrix);
        //right
        if(z + 1 < m) floodfill(y, z + 1, t, n, m, matrix);
    }
}