import java.io.*;
import java.util.*;

public class Problem_D {
	static final int[] dx = { 1, -1, 0, 0 };
	static final int[] dy = { 0, 0, 1, -1 };
	static int N, M;
	static char[][] maze;
	static boolean[][] chk;

	static class Pair {
		int x, y;

		Pair(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}

	public static boolean bfs(Pair p) {
		Queue<Pair> q = new LinkedList<>();
		chk[p.x][p.y] = true;
		q.offer(p);
		while (!q.isEmpty()) {
			p = q.poll();
			for (int i = 0; i < 4; i++) {
				int nx = p.x + dx[i];
				int ny = p.y + dy[i];
				if (chk[nx][ny]) {
					continue;
				}
				switch (maze[nx][ny]) {
				case '.':
					maze[nx][ny] = '#';
					break;
				case '#':
					break;
				case 'G':
					return false;
				case 'B':
					chk[nx][ny] = true;
					q.offer(new Pair(nx, ny));
					break;
				}
			}
		}
		return true;
	}

	public static boolean bfs2(Pair p) {
		if (maze[p.x][p.y] == '#') {
			return good_check();
		}
		for (int i = 1; i <= N; i++) {
			Arrays.fill(chk[i], false);
		}
		Queue<Pair> q = new LinkedList<>();
		chk[p.x][p.y] = true;
		q.offer(p);
		while (!q.isEmpty()) {
			p = q.poll();
			for (int i = 0; i < 4; i++) {
				int nx = p.x + dx[i];
				int ny = p.y + dy[i];
				if (chk[nx][ny]) {
					continue;
				}
				switch (maze[nx][ny]) {
				case '.':
					chk[nx][ny] = true;
					q.offer(new Pair(nx, ny));
					break;
				case '#':
					break;
				case 'G':
					chk[nx][ny] = true;
					q.offer(new Pair(nx, ny));
					break;
				case 'B':
					return false;
				}
			}
		}
		return good_check();
	}

	public static boolean good_check() {
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= M; j++) {
				if (maze[i][j] == 'G' && !chk[i][j]) {
					return false;
				}
			}
		}
		return true;
	}

	public static void main(String[] args) {
		InputReader in = new InputReader();
		StringBuilder out = new StringBuilder();

		int T = in.nextInt();
		while (T-- > 0) {
			N = in.nextInt();
			M = in.nextInt();
			maze = new char[N + 2][M + 2];
			chk = new boolean[N + 2][M + 2];
			Arrays.fill(maze[0], '#');
			Arrays.fill(maze[N + 1], '#');
			for (int i = 1; i <= N; i++) {
				maze[i][0] = maze[i][M + 1] = '#';
				String line = in.nextLine();
				for (int j = 1; j <= M; j++) {
					maze[i][j] = line.charAt(j - 1);
				}
			}
			boolean flag = true;
			ii: for (int i = 1; i <= N; i++) {
				for (int j = 1; j <= M; j++) {
					if (maze[i][j] == 'B' && !chk[i][j]) {
						if (!bfs(new Pair(i, j))) {
							flag = false;
							break ii;
						}
					}
				}
			}
			out.append(flag && bfs2(new Pair(N, M)) ? "Yes\n" : "No\n");
		}

		System.out.print(out);
	}

	static class InputReader {
		public BufferedReader reader;
		public StringTokenizer st;

		public InputReader() {
			reader = new BufferedReader(new InputStreamReader(System.in));
		}

		public String next() {
			while (st == null || !st.hasMoreTokens()) {
				st = new StringTokenizer(nextLine());
			}
			return st.nextToken();
		}

		public String nextLine() {
			try {
				return reader.readLine();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return null;
		}

		public int nextInt() {
			return Integer.parseInt(next());
		}
	}
}
