#include <bits/stdc++.h>
using namespace std;
int N, M;
vector<vector<int>> adj;
vector<int> dist;
vector<bool> visited;
vector<string> vec;
bool ok;
void dfs(int root) {
  visited[root] = true;
  for (int i = 0; i < (int)adj[root].size(); i++) {
    int child = adj[root][i];
    if (vec[child / M][child % M] == '#') continue;
    if (visited[child]) continue;
    if (vec[child / M][child % M] == 'B') {
      if (vec[root / M][root % M] == 'G') {
        ok = false;
        return;
      }
      vec[root / M][root % M] = '#';
      continue;
    }
    dfs(child);
  }
}
void dfs2(int root) {
  visited[root] = true;
  for (int i = 0; i < (int)adj[root].size(); i++) {
    int child = adj[root][i];
    if (vec[child / M][child % M] == '#') continue;
    if (visited[child]) continue;
    dfs2(child);
  }
}
bool valid(int i, int j) {
  if (i < 0 || i >= N || j < 0 || j >= M) return false;
  if (vec[i][j] == '#') return false;
  return true;
}
void solve() {
  ok = true;
  cin >> N >> M;
  for (int i = 0; i < (int)vec.size(); i++) vec[i].clear();
  vec.clear();
  vec.resize(N);
  for (int i = 0; i < (N); i++) cin >> vec[i];
  ;
  visited.clear();
  visited.resize(N * M);
  for (int i = 0; i < N * M; i++) visited[i] = false;
  for (int i = 0; i < (int)adj.size(); i++) adj[i].clear();
  adj.clear();
  dist.clear();
  dist.clear();
  dist.resize(N * M);
  for (int i = 0; i < N * M; i++) dist[i] = -1;
  adj.resize(N * M);
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++) {
      if (vec[i][j] == '#') continue;
      if (valid(i - 1, j)) adj[i * M + j].push_back((i - 1) * M + j);
      if (valid(i + 1, j)) adj[i * M + j].push_back((i + 1) * M + j);
      if (valid(i, j - 1)) adj[i * M + j].push_back(i * M + j - 1);
      if (valid(i, j + 1)) adj[i * M + j].push_back(i * M + j + 1);
    }
  }
  int G = 0, B = 0;
  for (int i = 0; i < N; i++) {
    for (char ch : vec[i]) {
      if (ch == 'G') G++;
      if (ch == 'B') B++;
    }
  }
  if (G == 0) {
    cout << "Yes" << endl;
    return;
  }
  if ((G > 0 && vec[N - 1][M - 1] == '#') || (vec[N - 1][M - 1] == 'B')) {
    cout << "No" << endl;
    return;
  }
  dfs2(N * M - 1);
  for (int i = 0; i < N * M; i++) {
    if (visited[i] == false && vec[i / M][i % M] == 'G') {
      cout << "No" << endl;
      return;
    }
  }
  for (int i = 0; i < N * M; i++) {
    visited[i] = false;
  }
  dfs(N * M - 1);
  if (!ok) {
    cout << "No" << endl;
    return;
  }
  if (vec[N - 1][M - 1] == '#') {
    cout << "No" << endl;
    return;
  }
  for (int i = 0; i < N * M; i++) visited[i] = false;
  dfs2(N * M - 1);
  for (int i = 0; i < N * M; i++) {
    if (visited[i] == false && vec[i / M][i % M] == 'G') {
      cout << "No" << endl;
      return;
    }
  }
  cout << "Yes" << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int T;
  cin >> T;
  while (T--) {
    solve();
  }
  return 0;
}
