import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.Queue;

public class D_Solve_The_Maze {
    public static void main(String arg[]) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(System.out);
        int T = Integer.parseInt(in.readLine());
        while (T-- > 0) {
            String[] input = in.readLine().split(" ");
            int N = Integer.parseInt(input[0]);
            int M = Integer.parseInt(input[1]);
            char[][] a = new char[N][M];
            for(int i = 0; i < N; i++) {
                a[i] = in.readLine().toCharArray();
            }
            boolean flag = true;
            for(int i = 0; flag && i < N; i++) {
                for(int j = 0; flag && j < M; j++) {
                    if(a[i][j] == 'B') {
                        int[] dl = {-1,0,1,0};
                        int[] dc = {0,1,0,-1};
                        for(int d = 0; d < 4; d++) {
                            int ni = i + dl[d];
                            int nj = j + dc[d];
                            if(0 <= ni && 0 <= nj && ni < N && nj < M) {
                                if(a[ni][nj] == 'G')
                                    flag = false;
                                if(a[ni][nj] == '.') {
                                    a[ni][nj] = '#';
                                }
                            }
                        }
                    }
                }
            }
            boolean[][] vis = new boolean[N][M];
            Queue<Integer> L = new LinkedList<>();
            Queue<Integer> C = new LinkedList<>();
            if(a[N-1][M-1] != '#') {
                vis[N-1][M-1] = true;
                L.add(N-1);
                C.add(M-1);
            }
            while (flag && !L.isEmpty()) {
                int i = L.remove();
                int j = C.remove();
                int[] dl = {-1, 0, 1, 0};
                int[] dc = {0, 1, 0, -1};
                for (int d = 0; d < 4; d++) {
                    int ni = i + dl[d];
                    int nj = j + dc[d];
                    if (0 <= ni && 0 <= nj && ni < N && nj < M) {
                        if (a[ni][nj] != '#' && vis[ni][nj] == false) {
                            vis[ni][nj] = true;
                            L.add(ni);
                            C.add(nj);
                        }
                    }
                }
            }
            for(int i = 0; flag && i < N; i++) {
                for (int j = 0; flag && j < M; j++) {
                    if(a[i][j] == 'G' && !vis[i][j]) {
                        flag = false;
                    }
                }
            }
            if(flag)
                out.println("Yes");
            else
                out.println("No");
        }
        out.close();
    }
    public static boolean path(char[][] a,int i,int j,int N,int M) {
        if(i== N-1 && j == M-1)
            return true;
        int[] dl = {-1,0,1,0};
        int[] dc = {0,1,0,-1};
        for(int d = 0; d < 4; d++) {
            int ni = i + dl[d];
            int nj = j + dc[d];
            if (0 <= ni && 0 <= nj && ni < N && nj < M) {
                if(a[ni][nj]!='#' && path(a,ni,nj,N,M))
                    return true;
            }
        }
        return false;
    }
}
