#!/usr/bin/env python3
import io
import os
from collections import deque

input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline

def get_str():
    return input().decode().strip()

def rint():
    return map(int, input().split())

def oint():
    return int(input())

def block_bads():
    for r in range(n):
        for c in range(m):
            if mat[r][c] == 'B':
                if not block_bad(r, c):
                    return False
    return True


def block_bad(r, c):
    for rr, cc in iter_edge(r, c):
        if rr == n-1 and cc == m-1:
            return False
        v = mat[rr][cc]
        if v == '.':
            mat[rr][cc] = '#'
        elif v == 'G':
            return False
    return True

def iter_edge(r, c):
    edge = []
    if r-1 >= 0:
        edge.append([r-1, c])
    if r+1 < n:
        edge.append([r+1, c])
    if c-1 >= 0:
        edge.append([r, c-1])
    if c+1 < m:
        edge.append([r, c+1])
    return iter(edge)

def bfs_good(r, c):
    q = deque()
    q.append([r, c])
    gc = 0
    mat[r][c] = 'v'
    while q:
        r, c = q.popleft()
        for rr, cc in iter_edge(r, c):
            v = mat[rr][cc]
            if v == '#' or v == 'v':
                continue
            if v == 'G':
                gc += 1
            mat[rr][cc] = 'v'
            q.append([rr,cc])
    return gc

def count_good():
    cnt = 0
    for i in range(n):
        cnt += mat[i].count('G')
    return cnt

t = oint()

for _ in range(t):
    n, m = rint()
    mat = []
    for i in range(n):
        mat.append(list(get_str()))
    gc = count_good()
    if not block_bads():
        if gc == 0:
            print('Yes')
        else:
            print('No')
    else:
        if gc == bfs_good(n-1, m-1):
            print('Yes')
        else:
            print('No')
