#include<bits/stdc++.h>
using namespace std;
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
//o-set
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
//debugging tool
template<typename T>
void debug(string name, T value) {
cerr << name << " = " << value << endl;
}
template<typename T, typename U>
void debug(string name, pair<T, U> value) {
cerr << name << " = {" << value.first << ", " << value.second << "}" << endl;
}
template<typename T>
void debug(string name, vector<T> v) {
cerr << name << " =[ ";
for (size_t i = 0; i < v.size(); i++) {
if (i) {
cerr << ", ";
}
cerr << v[i];
}
cerr << "]" << endl;
}
template<typename T>
void debug(string name, set<T> v) {
cerr << name << " =[ ";
for (auto it = v.begin(); it != v.end(); it++) {
if (it != v.begin()) {
cerr << ", ";
}
cerr << *it;
}
cerr << "]" << endl;
}
template<typename T, typename U>
void debug(string name, map<T, U> v) {
cerr << name << " =[ ";
for (auto it = v.begin(); it != v.end(); it++) {
if (it != v.begin()) {
cerr << ", ";
}
cerr << it->first << ": " << it->second;
}
cerr << "]" << endl;
}
#define DEBUG(x) debug(#x, x);
#define int long long
#define endl "\n"
#define rep(i, a, b) for (int i = 0; i < b; i++)
#define fr(i, a, b) for (int i = 0; i <= b; i++)
typedef vector<int> vi;
void solve() {
int n,m;
cin>>n>>m;
vector<vector<char>>grid(n,vector<char>(m,0));
vector<vector<int>>uptodown(n,vector<int>(m,0)),downtoup(n,vector<int>(m,0));
vector<vector<int>>lefttoright(n,vector<int>(m,0)),righttoleft(n,vector<int>(m,0));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>grid[i][j];
}
}
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<m;j++){
if(grid[i][j]=='+')cnt++,lefttoright[i][j]=cnt;
else cnt=0;
}
}
for(int i=0;i<n;i++){
int cnt=0;
for(int j=m-1;j>=0;j--){
if(grid[i][j]=='+')cnt++,righttoleft[i][j]=cnt;
else cnt=0;
}
}
for(int i=0;i<m;i++){
int cnt=0;
for(int j=0;j<n;j++){
if(grid[j][i]=='+')cnt++,uptodown[j][i]=cnt;
else cnt=0;
}
}
for(int i=0;i<m;i++){
int cnt=0;
for(int j=n-1;j>=0;j--){
if(grid[j][i]=='+')cnt++,downtoup[j][i]=cnt;
else cnt=0;
}
}
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// cout<<down[i][j]<<" ";
// }
// cout<<endl;
// }
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]=='-')continue;
int mn=INT_MAX;
mn=min(mn,lefttoright[i][j]);
mn=min(mn,righttoleft[i][j]);
mn=min(mn,uptodown[i][j]);
mn=min(mn,downtoup[i][j]);
if(mn%2==0) ans=max(ans,4*(mn-1)+1);
else{
mn--;
ans=max(ans,4*(mn)+1);
}
}
}
cout<<ans<<endl;
}
signed main() {
ios_base::sync_with_stdio(false);cin.tie(0);
int tt; cin >> tt;
while (tt--)
solve();
}